gpt4 book ai didi

xml - XSL问题:如何根据一组节点值选择一组节点?

转载 作者:行者123 更新时间:2023-12-03 16:20:21 25 4
gpt4 key购买 nike

XML / XSL / Xpath的新手,我已经在这些面板上搜寻了一个看似简单的问题的答案,但是也许我对XSL太陌生,无法理解那里可能解决的一些答案。

我想选择一组与文档中其他位置存储的一组不同的节点值匹配的节点,以便:

<body>
<partlist>
<part>head</part>
<part>spleen</part>
<part>toe</part>
</partlist>
<parts>
<head>this is a head</head>
<spleen>this is a spleen</spleen>
<toe>big toe</toe>
<toe>big toe</toe>
<parts>
</body>


因此,假设我要计算所有“部分”,但我不知道“部分”节点名称,我希望XPath expr匹配名称与另一组值相等的一组节点节点...

我对XSL陌生,他们都认为解决方案非常简单,但是经验丰富,足以意识到期望从XSL获得简单的解决方案肯定是错误的道路。

在我基于程序的无知中,这是我尝试的方法:

<xsl:template match="/">
<xsl:apply-templates select="partlist/part">
<xsl:with-param name="parts" select="parts"/>
</xsl:apply-templates>
</xsl:template>
<xsl:template match="part">
<xsl:param name="parts"/>
<xsl:value-of select="count($parts[.])"/>
</xsl:template>


但这是完全错误的。任何帮助深表感谢。

编辑:感谢您的回答,但我认为我不被理解-故障是我的,因为我还不太清楚...我需要的是一个结果,告诉我是否有任何与引用集的节点值...我认为会更改查询,因为我没有尝试输出计数列表,而是试图将一个集合与一个集合进行匹配以对总数进行计数...但是让我用XSL进行说明,如果可能的话..这是我上面的代码,略作修改以使我的意图清楚:

<xsl:template match="/">
<xsl:apply-templates select="partlist/part">
<xsl:with-param name="parts" select="parts"/>
</xsl:apply-templates>
</xsl:template>
<xsl:template match="part">
<xsl:param name="parts"/>
<xsl:if select="count($parts[.]) &gt; 0">1</xsl:if>
</xsl:template>


将以上内容应用于xml doc示例时,应输出:

1


这有意义吗?

编辑:我还应该指定我仅限于XSL 1.0

最佳答案

您可以使用local-name()函数获取节点的名称,以便可以将其与给定值进行比较。

例如,您的样式表可以修改为:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

<xsl:template match="/">
<xsl:apply-templates select="body/partlist/part"/>
</xsl:template>

<xsl:template match="part">
<xsl:variable name="part" select="."/>
<xsl:value-of select="count(/body/parts/*[local-name() = $part])"/>
</xsl:template>

</xsl:stylesheet>




编辑添加:

您还可以与一组值进行比较,而不仅仅是单个值。从 XPath 1.0 spec, section 3.4


如果要比较的一个对象是节点集,而另一个是字符串,
则只有当
节点集,以便对
节点的字符串值,另一个字符串为true。


如果要计算在 /body/parts下您的本地名称与 /body/partlist/part中列出的部分匹配的元素数,可以使用以下XPath表达式来实现:

count(/body/parts/*[local-name() = /body/partlist/part])


例如,可以在编辑后添加问题的最后一个转换,例如:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

<xsl:template match="body">
<xsl:apply-templates select="partlist">
<xsl:with-param name="parts" select="parts"/>
</xsl:apply-templates>
</xsl:template>

<xsl:template match="partlist">
<xsl:param name="parts"/>
<xsl:if test="count($parts/*[local-name() = current()/part]) &gt; 0">1</xsl:if>
</xsl:template>

</xsl:stylesheet>

关于xml - XSL问题:如何根据一组节点值选择一组节点?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11712557/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com