如何获得最后2个节点到先前的特定节点?

时间:2018-08-31 05:44:41

标签: xslt

这是我的xml:

<Line>
    <Item>
     <Id>1</Id>
     <Name>A</Name>
     <Unit>AA</Unit>
     <Value>5</Value>
    </Item>
</Line>
<Line>
    <Item>
     <Id>2</Id>
     <Name>B</Name>
     <Unit>Test</Unit>
     <Value>5</Value>
    </Item>
</Line>
<Line>
    <Item>
     <Id>3</Id>
     <Name>C</Name>
     <Unit>AA</Unit>
     <Value>5</Value>
    </Item>
</Line>
<Line>
    <Item>
     <Id>4</Id>
     <Name>D</Name>
     <Unit>AA</Unit>
     <Value>5</Value>
    </Item>
</Line>
<Line>
    <Item>
     <Id>5</Id>
     <Name>E</Name>
     <Unit>AA</Unit>
      <Value>5</Value>
    </Item>
</Line>

如何使用Unit = Test获得在节点之后的第一和第二位置的所有节点。在这种情况下,Id = 2的节点具有Unit = Test,因此我想显示Id = 3和Id = 4的节点。 谢谢

1 个答案:

答案 0 :(得分:1)

您想要的表情是这个...

<xsl:copy-of select="//Line[Item/Unit='Test']/following-sibling::Line[position() &lt;= 2]" />

无论当前节点是什么,这都将起作用。

或者,您可以将其拆分为模板。例如

<xsl:template match="/*">
  <xsl:apply-templates select="//Line[Item/Unit='Test']" />
</xsl:template>

<xsl:template match="Line">
  <xsl:copy-of select="following-sibling::Line[position() &lt;= 2]" />
</xsl:template>  

如果要获取3和4以外的所有节点,请改用此表达式

<xsl:copy-of select="//Line[not(preceding-sibling::Line[position() &lt;= 2][Item/Unit = 'Test'])]" />