XSLT复制所有文本

时间:2014-12-04 17:12:03

标签: xml xslt

我正在使用以下xsl转换:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
   <xsl:output omit-xml-declaration="yes" indent="yes" method="xml"/>   
   <xsl:template match="//something">
      <mytag>
         <xsl:copy-of select="node()"/>
      </mytag>
   </xsl:template>
</xsl:stylesheet>

它产生了希望的内容:

<mytag>
   <something ...
</mytag>
<mytag>
   <something ...
</mytag>
...

但另外,在希望的结果周围有xml文件的所有内容。例如。对于源文件:

<something>Hello</something>
<anotherthing>Bye</anotherthing>

我得到了结果(或类似的东西):

<mytag>
   <something>Hello</something>
</mytag>
Hello
Bye

我使用java.xml.transform.Transformer和Oxygen测试了转换。

感谢您的帮助!

1 个答案:

答案 0 :(得分:4)

问题在于,有一组“默认”模板规则适用于您没有明确模板的任何节点。如果您只对something元素感兴趣,那么最简单的方法是添加一个根模板,确保您将模板应用于这些模板,而不是其他节点不关心:

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

   <xsl:template match="/">
      <root>
         <xsl:apply-templates select="//something" />
      </root>
   </xsl:template>

   <xsl:template match="something">
      <mytag>
         <xsl:copy-of select="node()"/>
      </mytag>
   </xsl:template>
</xsl:stylesheet>

(注意我还在结果周围添加了一个根级元素,否则当输入中有多个something时,结果就不会很好。