xsl获取子节点

时间:2012-06-12 10:47:31

标签: xml xslt

我是xsl的新手,需要帮助:(。我需要将子节点作为父笔记的值。

<planet>
    <venus> sometext 
        <mass>123</mass>
    </venus> 
    <mars>text about mars</mars>
</planet>

所以我必须以这种形式得到它:

<venus>sometext
    <mass>123</mass>
</venus>
<mars> text about mars <mars>

节点必须在符号“&lt;”内和“&gt;”因为编译认为它们是父母笔记的内容。 感谢!!!

2 个答案:

答案 0 :(得分:2)

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

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

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

答案 1 :(得分:2)

此转化

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

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

 <xsl:template match="planet">
  <xsl:apply-templates/>
 </xsl:template>
</xsl:stylesheet>

应用于提供的XML文档时:

<planet> 
    <venus> sometext  
        <mass>123</mass> 
    </venus>  
    <mars>text about mars</mars> 
</planet>

会产生想要的正确结果:

<venus> sometext
        <mass>123</mass>
</venus>
<mars>text about mars</mars>

第二种解决方案 - 更直接,更短

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

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

解释

在这两种解决方案中,我们都避免复制元素树的根,并复制其子树。

在第一个解决方案中,复制子树是 identity rule 的效果 - 如果将来我们改变计划并决定不仅仅复制,这将为我们提供更大的灵活性子树的节点,但要转换它们中的一些或全部。

在第二个解决方案中,使用单个XSLT指令(<xsl:copy-of>)完成复制。在这里,我们交换灵活性以提高速度和紧凑性。