Как получить последние 2 узла предыдущего конкретного узла? - PullRequest
0 голосов
/ 31 августа 2018

Это мой 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 голосов
/ 31 августа 2018

Вы хотите получить следующее выражение ...

<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'])]" />
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...