2012-04-20 273 views
2

我正在研究一个让我有点头疼的XSLT,并且正在寻找一些提示。我正在转换一个XML,其中一些标记具有名称空间前缀,而另一些则不具有。我正在努力将所有标签转换为一个通用名称空间前缀。 XML的包含多个名称空间的XSLT for XML包含多个名称空间

例子:

<yes:Books> 
    <no:Book> 
     <Title>Yes</Title> 
     <maybe:Version>1</maybe:Version> 
    </no:Book> 
</yes:Books> 

我试图让:

<yes:Books> 
    <yes:Book> 
     <yes:Title>Yes</yes:Title> 
     <yes:Version>1</yes:Version> 
    </yes:Book> 
</yes:Books> 

的XML输入几个web服务,将要返回不同的命名空间的总和。我没有任何问题适当地将它们聚合在一起,它创建了一个我遇到问题的公共前缀名称空间。

最坏的情况下,我可以将它们排除在外,但我相信这不是推荐的。

谢谢。

回答

2

此转换允许希望最终前缀和其命名空间被指定为外部/全局参数。它显示了如何用同样的方式属性名处理:

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:output omit-xml-declaration="yes" indent="yes"/> 
<xsl:strip-space elements="*"/> 

<xsl:param name="pPrefix" select="'yes'"/> 
<xsl:param name="pNamespace" select="'yes'"/> 

<xsl:template match="*"> 
    <xsl:element name="{$pPrefix}:{local-name()}" namespace="{$pNamespace}"> 
    <xsl:apply-templates select="node()|@*"/> 
    </xsl:element> 
</xsl:template> 

<xsl:template match="@*"> 
    <xsl:attribute name="{$pPrefix}:{local-name()}" namespace="{$pNamespace}"> 
    <xsl:value-of select="."/> 
    </xsl:attribute> 
</xsl:template> 
</xsl:stylesheet> 

当应用在以下文件(提供一个有一个附加属性,使问题更具挑战性):

<yes:Books xmlns:yes="yes"> 
    <no:Book xmlns:no="no"> 
     <Title no:Major="true">Yes</Title> 
     <maybe:Version xmlns:maybe="maybe">1</maybe:Version> 
    </no:Book> 
</yes:Books> 

产生想要的,正确的结果:

<yes:Books xmlns:yes="yes"> 
    <yes:Book> 
     <yes:Title yes:Major="true">Yes</yes:Title> 
     <yes:Version>1</yes:Version> 
    </yes:Book> 
</yes:Books> 
+0

你太棒了!这工作没有问题。 – Randmness 2012-04-20 05:13:20

+0

@ user1345501:不客气。 – 2012-04-20 11:57:02

0
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:custom="c"> 
    <xsl:template match="/"> 
     <xsl:copy> 
      <xsl:apply-templates select="node()|@*"/> 
     </xsl:copy> 
    </xsl:template> 
    <xsl:template match="*"> 
     <xsl:element name="custom:{local-name()}" namespace-uri="c"> 
      <xsl:apply-templates/> 
     </xsl:element> 
    </xsl:template> 
</xsl:stylesheet> 
+0

这种反式在一般情况下形成有问题。属性被删除。 – 2012-04-20 04:13:34

相关问题