2

我是 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>

节点必须在符号“<”和“>”内,因为编译认为它们是父注释的内容。谢谢!!!

4

2 回答 2

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>

说明

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

在第一个解决方案中,子树的复制是恒等规则的影响——如果将来我们改变计划并决定不简单地复制子树的节点,而是转换部分或全部节点,这给了我们更大的灵活性.

在第二个解决方案中,复制是通过一条 XSLT 指令完成的—— <xsl:copy-of>。在这里,我们用灵活性换取速度和紧凑性。

于 2012-06-12T12:07:48.100 回答
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>
于 2012-06-12T11:25:18.090 回答