2016-06-12 237 views
0

我是XSLT的新手。我一直在试图转换XML很长一段时间,但无法做到。 的输入XML是这样的:如果它的值是version 2使用xslt替换xml中属性值中的字符串1.0

<Load v:MajorVersion="05" v:MinorVersion="01" xmlns="version 2" xmlns:v="version 2"> 
    <annotation/> 
    <Header></Header> 
    <Body></Body> 
</Load> 

输出应该替换属性xmlnsversion 2值和xmlns:vversion 1,否则应保持原样。
问题是这些属性很容易发生变化,输入xml可能类似于xmlns:nxmlns:m,或者这些属性可能不存在。

最后,我们应该寻找节点Load的所有属性,并在所有的属性搜索字符串version 2(喜欢的xmlns,XMLNS:V,XMLNS:N等) 和version 1更换。

请帮帮我。相信我我花了数小时为此寻找答案。

回答

0

您的属性是名称空间声明。因此,请查看“如何更改命名空间的URL”。

您可以尝试这样的事:

<xsl:stylesheet version="1.0" 
       xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
       xmlns:v2="version 2"> 
    <xsl:output method="xml" indent="yes" encoding="UTF-8"/> 
    <xsl:strip-space elements="*"/> 
    <xsl:template match="@*|node()"> 
      <xsl:copy> 
       <xsl:apply-templates select="node()"/> 
      </xsl:copy> 
    </xsl:template> 

    <xsl:template match="v2:*"> 
     <xsl:element name="{local-name()}" xmlns="version 1"> 
       <xsl:apply-templates select="node()|@*"/> 
     </xsl:element> 
    </xsl:template> 
    <xsl:template match="@v2:*"> 
    <xsl:attribute name="{local-name()}" xmlns="version 1"> 
     <xsl:value-of select="." /> 
    </xsl:attribute> 
    </xsl:template> 
</xsl:stylesheet 
+0

谢谢,我已经看到了上述解决方案。问题是,命名空间限定符是动态的,它可能会以v2或pidx的形式出现,甚至会出现其他情况。也可以有多个名称空间声明,其值为“版本2”。目的是替换所有名称空间声明,从“版本2”到“版本1” –

+0

您正在讨论命名空间uri相同的命名空间前缀。他们不重要。你只需要在你的xslt中有一个独特的前缀,它不需要和xml中的相同。试试上面的模板。 –

0

你需要考虑在XPath数据模型的方面,而不是在源XML的条款。如果您了解XML片段的数据模型,您将会明白,您不希望更改xmlns属性的值,您想要更改元素和属性名称的命名空间部分;也就是说,您希望创建名称与旧元素/属性具有相同本地名称但具有不同名称空间URI的新元素/属性。所以你想要的指令,如

<xsl:element name="name()" namespace="...."/> 
<xsl:attribute name="v:majorVersion" namespace="...."/>