通过xslt从xml中删除错误的属性

时间:2018-10-07 14:25:34

标签: xml xslt

我有一些xml,我正在尝试删除其他xslt将它们添加的错误属性。

<?xml version="1.0" encoding="UTF-8"?><MYXML xmlns="http://someURL/MYXML" xmlns:role="http://someURL/role">
    <firstElement>
        <LANGUAGE>Spanish</LANGUAGE>
        <VOCABULARY>Spain</VOCABULARY>
    </firstElement>
    <External xmlns="" xmlns:myxml="http://someURL/MYXML">
        <EXTARData/>
        <AnotherElementData>
            <AnotherElement xmlns="http://someURL/AnotherElement"/>
        </AnotherElementData>
    </External>
</MYXML><!--checksum=A477829F524D170104E87187AD2869F5443DD079196B0EDCD5C6B9CFDD315232 version=1-->

我想摆脱掉“ xmlns =”“ xmlns:myxml =” http:// someURL / MYXML“”而没有成功。

我的预期结果是:

<?xml version="1.0" encoding="UTF-8"?><MYXML xmlns="http://someURL/MYXML" xmlns:role="http://someURL/role">
    <firstElement>
        <LANGUAGE>Spanish</LANGUAGE>
        <VOCABULARY>Spain</VOCABULARY>
    </firstElement>
    <External >
        <EXTARData/>
        <AnotherElementData>
            <AnotherElement xmlns="http://someURL/AnotherElement"/>
        </AnotherElementData>
    </External>
</MYXML><!--checksum=A477829F524D170104E87187AD2869F5443DD079196B0EDCD5C6B9CFDD315232 version=1-->

有人可以帮我吗?

1 个答案:

答案 0 :(得分:0)

因此,您似乎想将没有命名空间的元素转换为根元素的命名空间:

  <xsl:template match="*[namespace-uri() = '']">
      <xsl:element name="{local-name()}" namespace="{namespace-uri(/*)}">
          <xsl:apply-templates select="@* | node()"/>
      </xsl:element>
  </xsl:template>

与身份转换一起提供

<xsl:stylesheet
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    version="1.0">

  <xsl:template match="@* | node()">
    <xsl:copy>
      <xsl:apply-templates select="@* | node()"/>
    </xsl:copy>
  </xsl:template>

  <xsl:template match="*[namespace-uri() = '']">
      <xsl:element name="{local-name()}" namespace="{namespace-uri(/*)}">
          <xsl:apply-templates select="@* | node()"/>
      </xsl:element>
  </xsl:template>

</xsl:stylesheet>

并得到https://xsltfiddle.liberty-development.net/eiZQaFX

<MYXML xmlns="http://someURL/MYXML" xmlns:role="http://someURL/role">
    <firstElement>
        <LANGUAGE>Spanish</LANGUAGE>
        <VOCABULARY>Spain</VOCABULARY>
    </firstElement>
    <External>
        <EXTARData />
        <AnotherElementData>
            <AnotherElement xmlns="http://someURL/AnotherElement" xmlns:myxml="http://someURL/MYXML" />
        </AnotherElementData>
    </External>
</MYXML><!--checksum=A477829F524D170104E87187AD2869F5443DD079196B0EDCD5C6B9CFDD315232 version=1-->

如您所见,这与XSLT 1中的身份转换所显示的结果并不完全相同,它复制了xmlns:myxml="http://someURL/MYXML"范围内的命名空间AnotherElement

使用XSLT 2或3处理器可以很容易地避免该问题,

                   

请参见https://xsltfiddle.liberty-development.net/eiZQaFX/1

使用XSLT 1处理器,您将需要更多的工作来确保复制元素时没有任何名称空间:

  <xsl:template match="*[namespace-uri() = '']//*[namespace-uri() != '']">
      <xsl:element name="{name()}" namespace="{namespace-uri()}">
          <xsl:apply-templates select="@* | node()"/>
      </xsl:element>
  </xsl:template>

完整的示例是

<xsl:stylesheet
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    version="1.0">

  <xsl:template match="@* | node()">
    <xsl:copy>
      <xsl:apply-templates select="@* | node()"/>
    </xsl:copy>
  </xsl:template>

  <xsl:template match="*[namespace-uri() = '']">
      <xsl:element name="{local-name()}" namespace="{namespace-uri(/*)}">
          <xsl:apply-templates select="@* | node()"/>
      </xsl:element>
  </xsl:template>

  <xsl:template match="*[namespace-uri() = '']//*[namespace-uri() != '']">
      <xsl:element name="{name()}" namespace="{namespace-uri()}">
          <xsl:apply-templates select="@* | node()"/>
      </xsl:element>
  </xsl:template>

</xsl:stylesheet>

https://xsltfiddle.liberty-development.net/eiZQaFX/2