XSLT XML to XML选择特定节点

时间:2012-08-08 21:34:05

标签: xml xslt

我正在尝试通过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>

任何帮助都将不胜感激。

2 个答案:

答案 0 :(得分: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>

由于您评论了要删除的某些单独的唯一子域名,因此您可以在此列表中包含这些子域名。 Tim的使用position()的解决方案适用于排除范围。

答案 1 :(得分: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>