gpt4 book ai didi

xslt - 在传递给xsl :for-each之前对节点集进行排序

转载 作者:行者123 更新时间:2023-12-04 05:59:46 24 4
gpt4 key购买 nike

我遇到一种情况,其中循环遍历已排序的节点集,并在每个节点上应用模板:

<div id="contractscontainer">
<xsl:for-each select="document">
<xsl:sort select="content[@name='ClientName']/text()" />
<xsl:apply-templates select="." mode="client-contract" />
</xsl:for-each>
</div>

我想对节点集中的“前” 5个节点进行特殊处理,并使其成为嵌套元素。问题在于它们需要与被排序时的顺序相同(因为它们在循环中)。

我已经计划通过使用两个 xsl:for-each元素来做到这一点,每个元素都具有从集合中选择的正确节点。但是,我无法执行此操作,因为需要先对它们进行排序,然后才能选择“第一个” 5。

例子:
<div id="contractscontainer">
<div class="first-five">
<xsl:for-each select="document[position() < 6]">
<xsl:sort select="content[@name='ClientName']/text()" />
<xsl:apply-templates select="." mode="client-contract" />
</xsl:for-each>
</div>
<div class="rest-of-them">
<xsl:for-each select="document[position() > 5]">
<xsl:sort select="content[@name='ClientName']/text()" />
<xsl:apply-templates select="." mode="client-contract" />
</xsl:for-each>
</div>
</div>

我认为这行不通,因为我在对节点进行排序之前先按位置选择了节点,但是我不能在 xsl:sort之外使用 xsl:for-each

我的处理方式有误吗?

编辑:我当前的解决方案是对它们进行排序并将排序后的集合存储在另一个变量中:
<xsl:variable name="sorted-docs">
<xsl:for-each select="document">
<xsl:sort select="content[@name='ClientName']/text()" />
<xsl:copy-of select="." />
</xsl:for-each>
</xsl:variable>

它有效,但是有更好的方法吗?

最佳答案

这是在XSLT 1.0中执行此操作的一种方法,而无需使用xxx:node-set()扩展功能:

<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="yes" indent="yes"/>

<xsl:template match="/*">
<html>
<div class="first-five">
<xsl:apply-templates select="num">
<xsl:sort select="." data-type="number"/>
<xsl:with-param name="pStart" select="1"/>
<xsl:with-param name="pEnd" select="5"/>
</xsl:apply-templates>
</div>
<div class="rest-of-them">
<xsl:apply-templates select="num">
<xsl:sort select="." data-type="number"/>
<xsl:with-param name="pStart" select="6"/>
</xsl:apply-templates>
</div>
</html>
</xsl:template>

<xsl:template match="num">
<xsl:param name="pStart"/>
<xsl:param name="pEnd" select="999999999999"/>

<xsl:if test="position() >= $pStart
and
not(position() > $pEnd)">
<p><xsl:value-of select="."/></p>
</xsl:if>
</xsl:template>

</xsl:stylesheet>

在此简单XML文档上应用了上述转换时:
<nums>
<num>5</num>
<num>3</num>
<num>6</num>
<num>8</num>
<num>4</num>
<num>1</num>
<num>9</num>
<num>2</num>
<num>7</num>
<num>10</num>
</nums>

产生想要的结果:
<html>
<div class="first-five">
<p>1</p>
<p>2</p>
<p>3</p>
<p>4</p>
<p>5</p>
</div>
<div class="rest-of-them">
<p>6</p>
<p>7</p>
<p>8</p>
<p>9</p>
<p>10</p>
</div>
</html>

关于xslt - 在传递给xsl :for-each之前对节点集进行排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2595695/

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