如何计算没有。 xsl:choose 次语句在 xsl:for 中执行 - 每个?
how to calculate no. of times xsl:choose statements executes inside xsl:for-each?
我需要获取所有的 ttype 和 vendor.id,如果 assemblyCustom/revisionCustom/entityTypeCode 和 assemblyCustom/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>
我需要获取所有的 ttype 和 vendor.id,如果 assemblyCustom/revisionCustom/entityTypeCode 和 assemblyCustom/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>