gpt4 book ai didi

xslt - 使用 XSLT key() 函数根据单独元素中的两个属性查找节点

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

我正在尝试使用 XSLT key() 函数返回所有 <Code> XML 文件中符合以下两个条件的元素:

Code[code=$code] AND ancestor::CodeType[type=$codeType]`


下面是输入 XML 的简化示例:

<Items>
<Item code-number="C1" category="ABC" />
<Item code-number="C3" category="ABC" />
<Item code-number="C1" category="XYZ" />
</Items>

<CodeTypes>
<CodeType type="ABC">
<SubType title="Category III Codes"> <!-- <SubType> elements are optional -->
<SubType title="Subcategory III-15 Codes">
<Code code="C1" description="Red" />
<Code code="C2" description="Green" />
<Code code="C3" description="Blue" />
<Code code="C3" description="Purple" /> <!-- Same code can appear more than once -->
</SubType>
</SubType>
<CodeType>
<CodeType type="XYZ">
<Code code="C1" description="Black" /> <!-- Same code can be used for multiple CodeTypes -->
<Code code="C2" description="Orange" />
<Code code="C3" description="Yellow" />
<CodeType>
</CodeTypes>

请注意,注释实际上并不存在于实际的 XML 中,我只是将它们添加到此处以阐明 XML 结构。


这是我尝试使用的 XSLT 转换,尽管它似乎不起作用:

<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:key name="LookupMatchingCodeElements" match="Code" use="concat(../@code, '+', ancestor::CodeType/@type)" />

<xsl:template match="Item">
<xsl:call-template name="GetCodeElements">
<xsl:with-param name="code" select="@code-number" />
<xsl:with-param name="codeType" select="@category" />
</xsl:call-template>
</xsl:template>

<xsl:template name="GetCodeElements">
<xsl:param name="code" />
<xsl:param name="codeType" />

<xsl:for-each select="key('LookupMatchingCodeElements', concat($code, '+', $codeType))">
<!-- process each <Code> element -->
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>


这就是我希望 key() 函数通过不同的输入返回的内容:

<!-- For code="C1" AND codeType="ABC" -->
<Code code="C1" description="Red" />

<!-- For code="C3" AND codeType="ABC" -->
<Code code="C3" description="Blue" />
<Code code="C3" description="Purple" />

<!-- For code="C1" AND codeType="XYZ" -->
<Code code="C1" description="Black" />


这可以用 key() 函数实现吗?由于两者都有数十万<Item><Code>元素,能够使用 <xsl:key>非常重要。

最佳答案

使用:

 <xsl:key name="kCode" match="Code"
use="concat(ancestor::CodeType[1]/@type, '+', @code)"/>

这是一个完整的转换:

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

<xsl:key name="kCode" match="Code"
use="concat(ancestor::CodeType[1]/@type, '+', @code)"/>

<xsl:template match="/">
<xsl:copy-of select="key('kCode', 'ABC+C1')"/>
====================
<xsl:copy-of select="key('kCode', 'ABC+C3')"/>
====================
<xsl:copy-of select="key('kCode', 'XYZ+C1')"/>
</xsl:template>
</xsl:stylesheet>

当此转换应用于以下文档时(提供的 XML 文本 -- 已更正格式错误):

<t>
<Items>
<Item code-number="C1" category="ABC" />
<Item code-number="C3" category="ABC" />
<Item code-number="C1" category="XYZ" />
</Items>
<CodeTypes>
<CodeType type="ABC">
<SubType title="Category III Codes">
<!-- <SubType> elements are optional -->
<SubType title="Subcategory III-15 Codes">
<Code code="C1" description="Red" />
<Code code="C2" description="Green" />
<Code code="C3" description="Blue" />
<Code code="C3" description="Purple" />
<!-- Same code can appear more than once -->
</SubType>
</SubType>
</CodeType>
<CodeType type="XYZ">
<Code code="C1" description="Black" />
<!-- Same code can be used for multiple CodeTypes -->
<Code code="C2" description="Orange" />
<Code code="C3" description="Yellow" />
</CodeType>
</CodeTypes>
</t>

产生了想要的、正确的结果:

<Code code="C1" description="Red"/>
====================
<Code code="C3" description="Blue"/>
<Code code="C3" description="Purple"/>
====================
<Code code="C1" description="Black"/>

关于xslt - 使用 XSLT key() 函数根据单独元素中的两个属性查找节点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14866666/

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