2

<Code>XSLT key() 関数を使用して、次の 2 つの条件に一致する 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>は非常に重要です。

4

1 に答える 1

5

使用:

 <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"/>
于 2013-02-14T03:30:56.600 に答える