唯一的xml节点

时间:2015-02-26 11:02:08

标签: xslt xml-parsing xslt-1.0

我有一个简单的xml如下所示,我必须提取p-node的唯一行

<T1>
   <S1>
      <p1>0</p1>
      <p2>0</p2>
      <p3>0</p3>
      <p4>0</p4>
      <p5>0</p5>
      <p6>0</p6>
   </S1>
   <S1>
      <p1>0</p1>
      <p2>0</p2>
      <p3>0</p3>
      <p4>0</p4>
      <p5>0</p5>
      <p6>0</p6>
   </S1>
   <S1>
      <p6>0</p6>
      <p7>0</p7>
      <p8>0</p8>
      <p9>0</p9>
      <p10>0</p10>
   </S1>
   <S1>
      <p6>0</p6>
      <p7>0</p7>
      <p8>0</p8>
      <p9>0</p9>
      <p10>0</p10>
   </S1>
   <S1>
      <p11>0</p11>
      <p12>0</p12>
      <p13>0</p13>
      <p14>0</p14>
      <p15>0</p15>
      <p16>0</p16>
   </S1>
</T1>

我想要所有唯一的节点P. 我希望输出像

P1
P2
P3
P4
P5
P6
P7
P8
P9
p10
P11
P12
P13
P14
P15
P16

使用xslt输出的节点。 提前谢谢。

1 个答案:

答案 0 :(得分:0)

您的问题没有显示任何任何努力,并且您没有显示您可能已尝试过的任何代码。但是,今天我感觉很慷慨,请使用下面的样式表。

XSLT样式表

正如Michael已经建议的那样,使用Muenchian分组来识别唯一的节点。定义一个找到唯一元素名称的键,并仅将模板应用于这些节点。

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

    <xsl:key name="elem-name" match="S1/*" use="name()"/>

    <xsl:template match="/T1">
      <xsl:apply-templates select="S1/*[generate-id() =
        generate-id(key('elem-name', name())[1])]"/>
    </xsl:template>

    <xsl:template match="*[starts-with(name(),'p')]">
        <xsl:value-of select="name()"/>
        <xsl:if test="following::*[starts-with(name(),'p')]">
            <xsl:text>&#xA;</xsl:text>
        </xsl:if>
    </xsl:template>

</xsl:transform>

如果p元素只是一个示例,您还可以为

定义模板匹配
<xsl:template match="S1/*">

文字输出

p1
p2
p3
p4
p5
p6
p7
p8
p9
p10
p11
p12
p13
p14
p15
p16