XSLT从xslt结果中删除不需要的xmlns

时间:2014-01-22 13:08:03

标签: xml xslt

我有这个包含XML作为字符串的XML:

<Result>
    <XML>
       &lt;PingRS xmlns="http://www.test.com"&gt;
          &lt;Message&gt;
             Hello.
          &lt;/Message&gt;
      &lt;/PingRS&gt;
    </XML>
</Result>

我正在使用这个XSLT转换它:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:msxsl="urn:schemas-microsoft-com:xslt" exclude-result-prefixes="msxsl">
  <xsl:template match="/Result">
    <xsl:value-of select="XML" disable-output-escaping="yes" />
  </xsl:template> 
</xsl:stylesheet>

要获得此结果:

<PingRS xmlns="http://www.test.com">
    <Message>Hello.</Message>
</PingRS>

我想在同一个XSLT文件中删除此xmlns属性。这可能吗?

1 个答案:

答案 0 :(得分:0)

这是可能的,但由于<XML>元素包含XML,因此必须通过字符串操作来完成:

<xsl:template match="/Result">
<xsl:variable name="xmlns" select="' xmlns=&quot;http://www.test.com&quot;'" />
    <xsl:value-of select="substring-before(XML, $xmlns)" disable-output-escaping="yes" />
    <xsl:value-of select="substring-after(XML, $xmlns)" disable-output-escaping="yes" />
</xsl:template> 

顺便说一句,你显示的结果是不正确的 - 你真正得到的是:

   <PingRS xmlns="http://www.test.com">
      <Message>
         Hello.
      </Message>
  </PingRS>

修改

如果xmlns的内容事先未知,您可以使用:

<xsl:template match="/Result">
    <xsl:value-of select="substring-before(XML, ' xmlns=&quot;')" disable-output-escaping="yes" />
    <xsl:value-of select="substring-after(substring-after(XML, ' xmlns=&quot;'), '&quot;')" disable-output-escaping="yes" />
</xsl:template>