Использование xslt получить значение узла в позиции X

как я могу использовать 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>

как я могу выбрать название элемента second.

4 ответов


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

<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() не поддается описанию, когда значение позиции является переменной типа строка:

<xsl:variable name="pos" select="'2'"/>
<xsl:value-of select="items/*[position()=$pos]"/>

просто немного расширить вопрос, в следующем 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".

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

(items/*/title)[2]

или

(items//title)[2]

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


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

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

вы могли бы сделать это с

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