XSLT 1.0与多个子节点不同

时间:2017-03-01 09:54:57

标签: xml xslt xslt-1.0

我有一个包含多个节点和子节点的xml。我需要不同的节点。 我发现了很多例子,但是它们用于单个子节点,而不是在我想检查多个子节点时。他们要么不为我工作,要么每次只获得1个子节点。不是完整的Row组。

<Rowsets>
  <Rowset>
    <Row>
       <alpha>1111</alpha>
       <bravo>2222</bravo>
       <charlie>3333</charlie>
    </Row>
    <Row>
       <alpha>165165</alpha>
       <bravo>2165165</bravo>
       <charlie>654165</charlie>
    </Row>
    <Row>
       <alpha>1111</alpha>
       <bravo>2222</bravo>
       <charlie>3333</charlie>
    </Row>
  </Rowset>
</Rowsets>

所以我需要一个具有不同Row节点的输出。 如您所见,第一个和最后一个Row节点是相同的。 如何获得仅有2个Row节点的输出,因为第3个节点只有一个。

这样的事情:

<Rowsets>
  <Rowset>
    <Row>
       <alpha>1111</alpha>
       <bravo>2222</bravo>
       <charlie>3333</charlie>
    </Row>
    <Row>
       <alpha>165165</alpha>
       <bravo>2165165</bravo>
       <charlie>654165</charlie>
    </Row>
  </Rowset>
</Rowsets>

不需要行集节点。我只需要唯一的Row节点。

目前我正试图在这个方向找到它:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:template match="@*|node()">
<xsl:copy>
     <xsl:apply-templates select="@*|node()" />
</xsl:copy>
</xsl:template>
<xsl:template match="Rowsets/Rowset/Row[alpha = following::Rowsets/Rowset/Row/alpha and bravo = following::Rowsets/Rowset/Row/bravo and charlie = following::Rowsets/Rowset/Row/charlie]"/>  
</xsl:stylesheet>

2 个答案:

答案 0 :(得分:2)

使用Muenchian grouping。做你的钥匙:

<xsl:key name="row" match="Row" use="concat(alpha, '|', bravo, '|', charlie)" />

并仅输出满足:

的行
Row[count(. | key('row', concat(alpha, '|', bravo, '|', charlie))[1]) = 1]

答案 1 :(得分:-1)

试试这个

<xsl:template match="@*|node()">
    <xsl:copy>
        <xsl:apply-templates select="@*|node()" />
    </xsl:copy>
</xsl:template>
<xsl:template match="Row[. = preceding-sibling::Row]"/>