使用 xslt 在 X 位置获取节点值
Posted
技术标签:
【中文标题】使用 xslt 在 X 位置获取节点值【英文标题】:Using xslt get node value at X position 【发布时间】:2011-11-19 07:31:21 【问题描述】:如何在不使用 foreach 的情况下使用 xslt,X 位置的节点值
<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>
如何选择第二个项目的标题。
【问题讨论】:
好问题,+1。请注意,大多数答案包含的表达式可能会根据 XML 文档选择不是item
XYZ 父级的子级的 title
。
【参考方案1】:
回答扩展问题。如果您选择所需元素的节点集,则可以使用位置值:
<xsl:value-of select="(items//title)[2]"/>
或:
<xsl:value-of select="(items/*/title)[2]"/>
注意在按位置选择之前返回所需节点集所需的括号用法。
您可以使用所谓的“在编程意义上”。但是,由于子元素的名称未知,您需要 *
:
<xsl:value-of select="items/*[2]"/>
请注意,XSLT 中的节点集不是从零开始的。在上述方式中,您选择的是第二个item,而不是第三个。
当您想将当前位置与以下数字进行比较时,您确实需要position()
:
<xsl:value-of select="items/*[position()>2]"/>
选择所有位置大于 2 的 item。position()
必不可少的其他情况是位置值是 string 类型的变量:
<xsl:variable name="pos" select="'2'"/>
<xsl:value-of select="items/*[position()=$pos]"/>
【讨论】:
我已经回答了扩展问题。希望对您有所帮助。 这对我解决类似的问题很有帮助。很好,简单的解决方案,谢谢。【参考方案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>
如何选择第二个项目的标题。
使用:
/*/*[starts-with(name(), 'item')][2]/title
这会选择:所有 title
元素,它们是顶部元素的所有子元素中第二个的子元素,其名称以字符串 "item"
开头。
请注意:
(items/*/title)[2]
或
(items//title)[2]
一般来说是不正确的,因为如果在 XML 文档中还有其他元素,例如(比如)"chapter"
具有 title
子元素,则上述表达式可以选择 chapter/title
element -- 但这里的任务是选择文档中的第二个title
,其父级只能是item
XYZ元素。
【讨论】:
+1 以获得更通用的解决方案。但是,在提供的示例中,我的答案中的表达式是正确的;如果输入文档发生更改,它们显然可能会出错。这也可能发生在您提供的表达式上。 @empo:谢谢,是的,虽然我的解决方案比您的解决方案更通用、更强大,但更激进的更改总是有可能使 any 解决方案变得不合适。所以,我通常关心很有可能,但不是极端的变化。 我同意,但要说我在答案中使用的表达不正确是不正确的:)。你可以说这些表达式不太健壮,如果输入文档发生变化,可能会失败。 @empo:这基本上就是我要说的,如果你读得好的话。我同意你的论点,所以我只是编辑并将“不正确”替换为“一般不正确”:)【参考方案3】:你可以使用 position()
<xsl:value-of select="/items/*[position()=2]/text()"/>
【讨论】:
【参考方案4】:你可以这样做
<xsl:value-of select="items/child[position()=2]"/>
【讨论】:
以上是关于使用 xslt 在 X 位置获取节点值的主要内容,如果未能解决你的问题,请参考以下文章