首页 > 解决方案 > 使用 XSLT 根据条件文本之间的位置添加逗号(,)或“或”

问题描述

我有 5 个产品产品 P、QR、S、T 输入 XML 有时会有所不同,可能会出现一个或两个或三个或四个或五个产品,但这里有 5 个产品 XML 发布了一些时间产品可能像产品 Q 一样重复两次,产品 R三次,有些产品可能会错过

<products>
<product>Product_P</product>
<product>Product_Q</product>
<product>Product_R</product>
<product>Product_S</product>
<product>Product_T</product>
</products>

如果重复输入 xml 2 个产品:

<products>
    <product>Product_P</product>
    <product>Product_Q</product>
    <product>Product_R</product>
<product>Product_Q</product>
    <product>Product_R</product>
    <product>Product_S</product>
<product>Product_Q</product>
    <product>Product_R</product>
    <product>Product_T</product>
    </products>

如果输入 xml 3 缺少某些产品:

<products>
    <product>Product_P</product>
    <product>Product_Q</product>
    <product>Product_T</product>
    </products>

如果输入 xml 4 其他类型的产品:

<products>
    <product>Product_P</product>
    <product>Product_U</product>
    <product>Product_R</product>
<product>Product_V</product>
    <product>Product_R</product>
    <product>Product_W</product>
<product>Product_Q</product>
    <product>Product_W</product>
    <product>Product_T</product>
    </products>

我需要与 P、Q、R、S、T 相关的输出产品,没有其他产品如下所述:

如果输入有一个值等于 product="Product_Q" 的产品,我想简单地打印

Product_Q

如果输入有两个产品值等于 product="Product_Q" 和 product="Product_S",我想打印

Product_Q or Product_S

如果输入的三个产品值等于 product="Product_P"、product="Product_Q" 和 product="Product_R",我想打印

Product_P, Product_Q or Product_R

如果输入有四个产品值等于 product="Product_P"、product="Product_Q"、product="Product_R" 和 product="Product_T",我想打印

Product_P, Product_Q, Product_R, Product_S or Product_T

如果输入有五个产品值等于 product="Product_P"、product="Product_Q"、product="Product_R"、product="Product_S" 和 product="Product_T",我想打印

Product_P, Product_Q, Product_R, Product_S  or Product_T

我试过下面的 XSLT 模板

<xsl:template match="products">
           <xsl:variable name="product" select="products/product"/>
                    <xsl:if test="$product='Product_P'">
                        <xsl:text>Product_P</xsl:text>
                    </xsl:if>
<xsl:if test="$product='Product_P' and Product_Q">
                        <xsl:text>or</xsl:text>
                    </xsl:if>
<xsl:if test="$product='Product_Q'">
                        <xsl:text>Product_Q</xsl:text>
                    </xsl:if>
<xsl:if test="$product='Product_P' and Product_Q and Product_R">
                        <xsl:text>or</xsl:text>
                    </xsl:if>
<xsl:if test="$product='Product_R'">
                        <xsl:text>Product_R</xsl:text>
                    </xsl:if>
<xsl:if test="$product='Product_S'">
                        <xsl:text>Product_S</xsl:text>
                    </xsl:if>
<xsl:if test="$product='Product_T'">
                        <xsl:text>Product_T</xsl:text>
                    </xsl:if>
    </xsl:template>

请提前协助谢谢。

标签: xmlxslt-2.0

解决方案


第一步是识别不同的产品:

distinct-values(products/product)

然后使用选择要保留的产品的谓词过滤结果:

[matches(., '^Product_[PQRST]$')]

然后添加格式:

<xsl:for-each select="distinct-values(products/product)[matches(., '^Product_[PQRST]$')]">
  <xsl:value-of select="if (position()=1) then ''
                        else if (position()=last()) then ' or '
                        else ', '"/>
  <xsl:value-of select="."/>
</xsl:for-each>

注意:您的要求仍然没有说明所需的输出顺序。


推荐阅读