gpt4 book ai didi

xslt - 使用 XSLT 进行位置分组

转载 作者:行者123 更新时间:2023-12-01 09:36:28 26 4
gpt4 key购买 nike

我有一个包含一些文档的 xml:

<document>
<line id="0">
<field id="0"><![CDATA[H:doc1]]></field>
</line>
<line id="1">
<field id="0"><![CDATA[L:1]]></field>
</line>
<line id="2">
<field id="0"><![CDATA[L:2]]></field>
</line>
<line id="3">
<field id="0"><![CDATA[L:3]]></field>
</line>
<line id="4">
<field id="0"><![CDATA[H:doc2]]></field>
</line>
<line id="5">
<field id="0"><![CDATA[L:1]]></field>
</line>
</document>

H=文档标题,L=行项目。在此示例中,有两个 H 表示两个文档,编号为 doc1 和 doc2。 doc1 有三个订单项,doc2 有一个订单项。

如何使用 xslt 版本 1 转换数据以获得此结果:

<documents>
<document>
<header>
<number>doc1</number>
</header>
<line-item>
<line-number>1</line-number>
<line-number>2</line-number>
<line-number>3</line-number>
</line-item>
</document>
<document>
<header>
<number>doc2</number>
</header>
<line-item>
<line-number>1</line-number>
</line-item>
</document>
</documents>

最佳答案

这个 XSLT 1.0 转换:

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

<xsl:key name="kFollowing"
match="line[starts-with(field,'L:')]"
use="generate-id(preceding-sibling::line
[starts-with(field,'H:')]
[1]
)"/>

<xsl:template match="/">
<documents>
<xsl:apply-templates/>
</documents>
</xsl:template>

<xsl:template match="line[starts-with(field,'H:')]">
<document>
<header>
<number><xsl:value-of select="substring-after(field,'H:')"/></number>
<line-item>
<xsl:apply-templates mode="inGroup" select=
"key('kFollowing', generate-id())"/>
</line-item>
</header>
</document>
</xsl:template>

<xsl:template match="line" mode="inGroup">
<line-number>
<xsl:value-of select="substring-after(field,'L:')"/>
</line-number>
</xsl:template>
<xsl:template match="text()"/>
</xsl:stylesheet>

应用于提供的 XML 文档时:

<document>
<line id="0">
<field id="0"><![CDATA[H:doc1]]></field>
</line>
<line id="1">
<field id="0"><![CDATA[L:1]]></field>
</line>
<line id="2">
<field id="0"><![CDATA[L:2]]></field>
</line>
<line id="3">
<field id="0"><![CDATA[L:3]]></field>
</line>
<line id="4">
<field id="0"><![CDATA[H:doc2]]></field>
</line>
<line id="5">
<field id="0"><![CDATA[L:1]]></field>
</line>
</document>

产生想要的正确结果:

<documents>
<document>
<header>
<number>doc1</number>
<line-item>
<line-number>1</line-number>
<line-number>2</line-number>
<line-number>3</line-number>
</line-item>
</header>
</document>
<document>
<header>
<number>doc2</number>
<line-item>
<line-number>1</line-number>
</line-item>
</header>
</document>
</documents>

说明:使用按键方便地指定和选择“标题”之后的相邻“行”的完整组。

关于xslt - 使用 XSLT 进行位置分组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6789838/

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