gpt4 book ai didi

节点上的 XSLT 1.0 逻辑

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

相等的节点应该在单个计数器元素下。输入:

<Move-Afile>
<Afile>
<Item>
<PACK050>
<PackNumber>1234</PackNumber>
</PACK050>
</Item>
<Item>
<PACK050>
<PackNumber>567</PackNumber>
</PACK050>
</Item>
<Item>
<PACK050>
<PackNumber>567</PackNumber>
</PACK050>
</Item>
<Item>
<PACK050>
<PackNumber>126</PackNumber>
</PACK050>
</Item>
<Item>
<PACK050>
<PackNumber>567</PackNumber>
</PACK050>
</Item>
</Afile>
</Move-Afile>

对于每个包号,我们需要增加计数器变量,但这里存在一个条件,比如如果前一个等于当前我们必须忽略计数器(不需要增加),如下面的输出。所有相等的节点像下面的输出一样在一个柜台下。

XSLT 模板应包含 <for-each>像下面的结构。

<xsl:template match="/">
<A>
<target>
<xsl:for-each select="/Move-Afile/Afile/Item/PACK050/PackNumber">

<xsl:variable name="count">
<!-- get the count here-->
</xsl:variable>

<counter>$count</counter>
<PNumber><xsl:value-of select="."/></PNumber>

</xsl:for-each>
</target>
</A>
</xsl:template>

输出:

<A>
<target>
<Item>
<PACK050>
<counter>1</counter><!-- if previous <PackNumber> is not equal to current <PackNumber> increment the count-->
<PNumber>1234</PNumber>
</PACK050>
</Item>
<Item
<PACK050>
<counter>2</counter><!-- if previous <PackNumber> is not equal to current <PackNumber> increment the count-->
<PNumber>567</PNumber>
</PACK050>
</Item>
<Item><!-- if previous <PackNumber> is equal to current <PackNumber> ignore the counter -->
<PACK050>
<PNumber>567</PNumber>
</PACK050>
</Item>
<Item><!-- if previous <PackNumber> is equal to current <PackNumber> ignore the counter -->
<PACK050>
<PNumber>567</PNumber>
</PACK050>
</Item>
<Item>
<PACK050>
<counter>3</counter><!-- if previous <PackNumber> is not equal to current <PackNumber> increment the count-->
<PNumber>126</PNumber>
</PACK050>
</Item>

</target>
</A>

最佳答案

不要将其视为递增计数器,而应将其视为对相似节点进行分组。您在这里要做的是根据 PackNumberItem 元素进行分组,然后为每个组写出第一个匹配的 Item有一个 counter 值,其余没有。

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:key name="itemByPnum" match="Item" use="PACK050/PackNumber" />

<xsl:template match="/">
<A>
<target>
<xsl:apply-templates select="Move-Afile/Afile/Item[generate-id() =
generate-id(key('itemByPnum', PACK050/PackNumber)[1])]" />
</target>
</A>
</xsl:template>

<xsl:template match="Item">
<xsl:apply-templates select="." mode="copy">
<xsl:with-param name="counter">
<counter><xsl:value-of select="position()" /></counter>
</xsl:with-param>
</xsl:apply-templates>
<!-- copy without the <counter> all matching Items except the first one -->
<xsl:apply-templates mode="copy"
select="key('itemByPnum', PACK050/PackNumber)
[generate-id() != generate-id(current())]" />
</xsl:template>

<xsl:template match="Item" mode="copy">
<xsl:param name="counter" />
<Item>
<PACK050>
<xsl:copy-of select="$counter" />
<PNumber><xsl:value-of select="PACK050/PackNumber" /></PNumber>
</PACK050>
</Item>
</xsl:template>
</xsl:stylesheet>

这是称为 Muenchian 分组的技术示例。 / 模板中的初始 apply-templates 提取每个 PackNumberfirst Item >,然后 Item 模板会为该组生成正确的输出。

关于节点上的 XSLT 1.0 逻辑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16797246/

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