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

Posted

技术标签:

【中文标题】如何计算没有。 xsl:choose 语句在 xsl:for-each 中执行的次数?【英文标题】:how to calculate no. of times xsl:choose statements executes inside xsl:for-each? 【发布时间】:2021-11-29 23:33:26 【问题描述】:

如果 assemblyCustom/revisionCustom/entityTypeCodeassemblyCustom/revisionCustom/usCode 与任何 ttypes-config 匹配,我需要获取所有 ttype 和 vendor.id /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>

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

【问题讨论】:

从您的描述中我无法理解一件商品是否需要同时满足两个条件或仅满足其中一个条件。 请编辑问题以将其限制为具有足够详细信息的特定问题,以确定适当的答案。 【参考方案1】:

如果我理解正确(大 IF!),你想做这样的事情:

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>

【讨论】:

以上是关于如何计算没有。 xsl:choose 语句在 xsl:for-each 中执行的次数?的主要内容,如果未能解决你的问题,请参考以下文章

XSL/FO 在选择语句中跳过一个值

需要帮助选择带有 xsl:choose 和 xsl/when 的 XSLT

XSLT 中的十进制格式以及字符

跳过空XML节点

XSL 选择样式文本和 td

在 XSLT 中检查字符串是不是为空或空