如何计算没有。 xsl:choose 次语句在 xsl:for 中执行 - 每个?

how to calculate no. of times xsl:choose statements executes inside xsl:for-each?

我需要获取所有的 ttype 和 vendor.id,如果 assemblyCustom/revisionCustom/entityTypeCodeassemblyCustom/revisionCustom/usCode 分别匹配任何 ttypes-config/item/enityTypeCode/ttypes-config/item/usCode

这是我的输入xml。

<?xml version="1.0" encoding="UTF-8"?>
<combined-xml>
    <assemblyCustom>
        <revisionCustom>
            <entityTypeCode>C</entityTypeCode>
            <usCode>G</usCode>
        </revisionCustom>
    </assemblyCustom>
    <ttypes-config>
        <item>
            <vendor.id>111</vendor.id>
            <ttype>AAA</ttype>
            <enityTypeCode>
                <item>C</item>
                <item>D</item>
                <item>E</item>
                <item>F</item>
            </enityTypeCode>
            <usCode>
                <item>G</item>
                <item>H</item>
                <item>I</item>
                <item>J</item>
                <item>K</item>
                <item>L</item>
                <item>M</item>
            </usCode>
        </item>
        <item>
            <vendor.id>222</vendor.id>
            <ttype>BBB</ttype>
            <enityTypeCode>
                <item>N</item>
                <item>C</item>
            </enityTypeCode>
            <usCode>
                <item>G</item>
            </usCode>
        </item>
        <item>
            <vendor.id>333</vendor.id>
            <ttype>CCC</ttype>
            <enityTypeCode>
                <item>Q</item>
                <item>R</item>
            </enityTypeCode>
            <usCode>
                <item>S</item>
            </usCode>
        </item>
        <item>
            <vendor.id>444</vendor.id>
            <ttype>DDD</ttype>
            <enityTypeCode>
                <item>T</item>
                <item>U</item>
            </enityTypeCode>
            <usCode>
                <item>V</item>
            </usCode>
        </item>
        
        <item>
            <vendor.id>555</vendor.id>
            <ttype>EEEs</ttype>
            <enityTypeCode>
                <item>W</item>
                </enityTypeCode>
            <usCode>
                <item>X</item>
                <item>Y</item>
            </usCode>
        </item>
    </ttypes-config>
</combined-xml>

如果给定的条件匹配,则输出应该是

<?xml version="1.0" encoding="UTF-8"?>
<ttype-output>
    <ttype>AAA</ttype>
    <vendor.id>111</vendor.id>
    <ttype>BBB</ttype>
    <vendor.id>222</vendor.id>
   
</ttype-output>

如果不匹配任何 ttypes-config/item/ 那么输出应该是

<?xml version="1.0" encoding="UTF-8"?>
<ttype-output>
    <ttype>Default</ttype>
    <vendor.id>000</vendor.id>
</ttype-output>

以下是我的xsl文件

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>

    <xsl:variable name="entityTypeCode">
        <xsl:value-of select="combined-xml/assemblyCustom/revisionCustom/entityTypeCode"/>
    </xsl:variable>
    <xsl:variable name="usCode">
        <xsl:value-of select="combined-xml/assemblyCustom/revisionCustom/usCode"/>
    </xsl:variable>

    <xsl:template match="/combined-xml/ttypes-config/item">
        <xsl:variable name="current_entityTypeCode">
            <xsl:value-of select="enityTypeCode"/>
        </xsl:variable>
        <xsl:variable name="current_usCode">
            <xsl:value-of select="usCode"/>
        </xsl:variable>
        <xsl:if test="contains($current_entityTypeCode, $entityTypeCode) and contains($current_usCode, $usCode)">
            <ttype>
                <xsl:value-of select="ttype"/>
            </ttype>
            <vendor.id>
                <xsl:value-of select="vendor.id"/>
            </vendor.id>
        </xsl:if>

    </xsl:template>
    <xsl:template match="/">
        <ttype-output>
            <xsl:apply-templates select="/combined-xml/ttypes-config/item"></xsl:apply-templates>
        </ttype-output>
    </xsl:template>

</xsl:stylesheet>

我能够根据条件获取 ttype 和供应商 ID,但是我如何在 for-each 中应用 xsl:otherwise 条件,因为只有在条件不满足任何迭代时才应打印默认 ttype .

如果我理解正确(如果我理解错了!),你想做如下事情:

XSLT 1.0

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

<xsl:key name="entity" match="ttypes-config/item" use="enityTypeCode/item" />
<xsl:key name="us" match="ttypes-config/item" use="usCode/item" />

<xsl:template match="/combined-xml">
    <xsl:variable name="match-entity" select="key('entity', assemblyCustom/revisionCustom/entityTypeCode)" />
    <xsl:variable name="match-us" select="key('us', assemblyCustom/revisionCustom/usCode)" />
    <ttype-output>
        <xsl:choose>
            <xsl:when test="$match-entity">
                <xsl:copy-of select="$match-entity/ttype"/>
            </xsl:when>
            <xsl:otherwise>
                <ttype>Default</ttype>
            </xsl:otherwise>
        </xsl:choose>
        <xsl:choose>
            <xsl:when test="$match-us">
                <xsl:copy-of select="$match-us/vendor.id"/>
            </xsl:when>
            <xsl:otherwise>
                <vendor.id>000</vendor.id>
            </xsl:otherwise>
        </xsl:choose>
    </ttype-output>
</xsl:template>

</xsl:stylesheet>