我正在尝试使用 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>
非常重要。