使用xslt 1.0

时间:2016-06-12 12:33:43

标签: xml xslt

我是XSLT的新手。我一直在尝试转换XML很长一段时间但无法做到。 输入XML是这样的:

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

如果值为xmlns,则输出应将属性xmlns:vversion 2的值从version 1替换为version 2,否则应将其保留为是。
问题是属性很容易发生变化,输入xml可能像xmlns:nxmlns:m,或者这些属性甚至可能不存在。

最后,我们应该搜索节点Load的所有属性,并在所有属性中搜索字符串version 2(如xmlns,xmlns:v,xmlns:n等) 并由version 1替换。

请帮帮我。相信我,我花了好几个小时为此找到答案。

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

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

这样的指令
<xsl:element name="name()" namespace="...."/>
<xsl:attribute name="v:majorVersion" namespace="...."/>