Используя xslt получить значение узла в позиции X - PullRequest
9 голосов
/ 17 сентября 2011

Как я могу получить, используя xslt, значение узла в позиции X, без использования foreach

<items>
<item1>x</item1>
<item2>x</item2>
<item3>x</item3>
</items>

Это объясняется в смысле программирования:

<xsl:value-of select="Items/Item[2]"/>

=============================================== ===

Просто чтобы немного расширить вопрос, в следующем XML:

<items>
    <about>xyz</about>
    <item1>
       <title>t1</title>
       <body>b1</body>
    </item1>
    <item2>
       <title>t2</title>
       <body>b2</body>
    </item2>
    <item3>
       <title>3</title>
       <body>3</body>
   </item3>
</items>

Как выбрать заголовок второго элемента.

Ответы [ 4 ]

17 голосов
/ 17 сентября 2011

Ответ на расширенный вопрос.Вы можете использовать позиционное значение, если вы выбираете набор узлов из требуемых элементов:

<xsl:value-of select="(items//title)[2]"/>

или:

<xsl:value-of select="(items/*/title)[2]"/>

Обратите внимание на использование скобок, необходимых для возврата требуемого узла-установить перед выбором по позиции.


Вы можете использовать то, что вы назвали «в смысле программирования».Однако вам нужно * из-за неизвестного имени дочерних элементов:

<xsl:value-of select="items/*[2]"/>

Обратите внимание, что наборы узлов в XSLT не начинаются с нуля.Таким образом, вы выбираете второй элемент , а не третий .

. Вам действительно нужно position(), если вы хотите сравнить текущую позицию с числомкак в:

<xsl:value-of select="items/*[position()>2]"/>

, чтобы выбрать все элемент с позицией, превышающей 2. Другой случай, когда position() является обязательным, - это когда значение позиции является переменной типа string :

<xsl:variable name="pos" select="'2'"/>
<xsl:value-of select="items/*[position()=$pos]"/>
4 голосов
/ 17 сентября 2011

Просто немного расширить вопрос в следующем XML:

<items> 
    <about>xyz</about> 
    <item1> 
       <title>t1</title> 
       <body>b1</body> 
    </item1> 
    <item2> 
       <title>t2</title> 
       <body>b2</body> 
    </item2> 
    <item3> 
       <title>3</title> 
       <body>3</body> 
   </item3> 
</items>

Как выбрать заголовок второго элемента .

Используйте :

/*/*[starts-with(name(), 'item')][2]/title

Выбирает : все элементы title, являющиеся дочерними элементами второго из всех дочерних элементов верхнего элемента, имена которых начинаются со строки "item".

Обратите внимание, что такие выражения, как :

(items/*/title)[2]

или

(items//title)[2]

в целом неверны , потому что, если в документе XML есть другие элементы, такие как (скажем) "chapter", которые имеют title потомков, вышеприведенные выражения могут выбрать элемент chapter/title - , но задача здесь состоит в том, чтобы выбрать второй title в документе, родительским элементом которого может быть только элемент item XYZ .

2 голосов
/ 17 сентября 2011

Вы можете сделать это с

<xsl:value-of select="items/child[position()=2]"/>
2 голосов
/ 17 сентября 2011

Вы можете использовать положение ()

<xsl:value-of select="/items/*[position()=2]/text()"/>
...