gpt4 book ai didi

xml - 选择属性值最低的两个元素并在输出中将它们合并为一个元素

转载 作者:行者123 更新时间:2023-12-03 16:13:40 26 4
gpt4 key购买 nike

使用 xslt/xpath,我需要能够选择 属性值最小的两个元素合并 , 在某种方式。比如说我有:

<root>
<integer val="14"/>
<integer val="7"/>
<integer val="2"/>
<integer val="1"/>
<integer val="4"/>
<integer val="8"/>
</root>

我想选择两个最低值(1 和 2)并将它们表示为输出中的一个元素。属性值应该是这两个最低值的总和,所以我想要:
<root>
<integer val="3"/>
</root>

我也被限制使用 只有 xslt 1.0 ,因为xml是用java 1.5 api处理的,它似乎不支持xslt 2.0。我该怎么做才能让我的样式表解决这个看似简单的任务?

我的第一次尝试是使用排序:
<xsl:template match="root">
<xsl:copy>
<xsl:apply-templates select="integer">
<xsl:sort data-type="number" select="@val"/>
</xsl:apply-templates>
</xsl:copy>
</xsl:template>



<xsl:template match="integer[1]">
<xsl:copy>
<xsl:attribute name="val">
<xsl:value-of select="@val + ../integer[2]/@val"/>
</xsl:attribute>
</xsl:copy>
</xsl:template>

然而,这没有任何结果。只有一个空的根节点。显然, 禁用了执行 的能力([1] 部分是不与排序一起工作的部分)。而且,即使它确实有效,[1] 似乎也指的是文档顺序,而不是排序顺序。将第二个模板更改为:
<xsl:template match="integer"> 
<xsl:copy>
<xsl:attribute name="val">
<xsl:value-of select="../integer[2]/@val"/>
</xsl:attribute>
</xsl:copy>
</xsl:template>

结果输出所有输出 val 属性都是 7(而不是 2,我希望它是)

另一种方法是使用 min() xpath 函数。然而,这很快就失败了,因为 min() 在 1.0 中不可用。而且,即使 min 可用,找到 也并非易事。两个最小的元素并合并它们。

最佳答案

不是最好的解决方案,但它有效:

<xsl:template match="/">
<xsl:variable name="first">
<xsl:call-template name="getNum">
<xsl:with-param name="pos" select="1"/>
</xsl:call-template>
</xsl:variable>
<xsl:variable name="second">
<xsl:call-template name="getNum">
<xsl:with-param name="pos" select="2"/>
</xsl:call-template>
</xsl:variable>

<p><xsl:value-of select="$first + $second"/></p>
</xsl:template>

<xsl:template name="getNum">
<xsl:param name="pos"/>
<xsl:for-each select="/root/integer">
<xsl:sort data-type="number" select="@val" order="ascending"/>
<xsl:if test="position()=$pos">
<xsl:value-of select="@val"/>
</xsl:if>
</xsl:for-each>

</xsl:template>

关于xml - 选择属性值最低的两个元素并在输出中将它们合并为一个元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1293071/

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