0

我正在尝试通过 XSLT 将一个非常复杂的 XML 文件转换为 XML,因此它将是先前 XML 文档的副本,仅在输出中排除了第二个孙节点。希望有一个使用 XSLT 的简单解决方案。

这是我尝试转换的 XML 示例:

<cases>
    <Parent>
        <text1>Text1</text1>
        <text2>Text2</text2>
        <text3>Text3</text3>
        <Child_node>
             <Grandchild_node>
                 <gctext1>Sample text 1</gctext1>
                 <gctext2>Sample text 2</gctext2>
                 <gctext3>Sample text 3</gctext3>
                 <Great_grandchild_node>
                     <ggctext1>Great grandchild text 1</ggctext1>
                 </Great_grandchild_node>
             </Grandchild_node>
             <Grandchild_node>
                 <gctext1>More Sample text 1</gctext1>
                 <gctext2>Different Sample text 2</gctext2>
                 <gctext3>More Sample text 3</gctext3>
                 <Great_grandchild_node>
                     <ggctext1>Great grandchild text 2</ggctext1>
                 </Great_grandchild_node>
             </Grandchild_node>
        </Child_node>
    </Parent>
</cases>

我希望输出显示除第二个 Grandchild_node 中包含的信息之外的所有内容。我想要实现的输出示例:

<cases>
    <Parent>
        <text1>Text1</text1>
        <text2>Text2</text2>
        <text3>Text3</text3>
        <Child_node>
             <Grandchild_node>
                 <gctext1>Sample text 1</gctext1>
                 <gctext2>Sample text 2</gctext2>
                 <gctext3>Sample text 3</gctext3>
                 <Great_grandchild_node>
                     <ggctext1>Great grandchild text 1</ggctext1>
                 </Great_grandchild_node>
             </Grandchild_node>
        </Child_node>
    </Parent>
</cases>

任何帮助,将不胜感激。

4

2 回答 2

2

您应该能够将xsl:copy与匹配您想要删除的任何节点结合使用:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="xml" indent="yes"/>
    <xsl:template match="node()">
        <xsl:copy>
            <xsl:apply-templates/>
        </xsl:copy>
    </xsl:template>
    <xsl:template match="Grandchild_node[2]|Grandchild_node[5]"></xsl:template>
</xsl:stylesheet>

由于您评论说要删除一些单独的唯一child_nodes,因此您可以将它们包含在此列表中。Tim 使用 position() 的解决方案适用于排除范围。

于 2012-08-08T22:05:57.363 回答
2

这可以通过向恒等变换添加一个额外的模板匹配来简单地匹配不在第一个位置的Grandchild_node元素来实现

<xsl:template match="Grandchild_node[position() > 1]" />

因此,给定以下 XSLT

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

   <xsl:template match="Grandchild_node[position() > 1]" />

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

应用于您的示例 XML 时,将输出以下内容

<cases>
   <Parent>
      <text1>Text1</text1>
      <text2>Text2</text2>
      <text3>Text3</text3>
      <Child_node>
         <Grandchild_node>
            <gctext1>Sample text 1</gctext1>
            <gctext2>Sample text 2</gctext2>
            <gctext3>Sample text 3</gctext3>
            <Great_grandchild_node>
               <ggctext1>Great grandchild text 1</ggctext1>
            </Great_grandchild_node>
         </Grandchild_node>
      </Child_node>
   </Parent>
</cases>
于 2012-08-08T22:06:40.087 回答