Xml 添加逗号(,)或“;或;根据使用XSLT的条件文本之间的位置

Xml 添加逗号(,)或“;或;根据使用XSLT的条件文本之间的位置,xml,xslt-2.0,Xml,Xslt 2.0,我有5个产品产品p、Q R、S、T输入XML有时会有所不同,一个或两个或三个或四个或五个产品可能会出现,但这里发布了5个产品XML有时产品可能会重复,如产品Q两次和产品R三次,有些产品可能会错过 <products> <product>Product_P</product> <product>Product_Q</product> <product>Product_R</product> <product&

我有5个产品产品p、Q R、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>
如果输入的两个产品值分别等于product=“product_Q”和product=“product_S”,则我要打印

Product_Q or Product_S
Product_P, Product_Q or Product_R
Product_P, Product_Q, Product_R, Product_S or Product_T
Product_P, Product_Q, Product_R, Product_S  or Product_T
如果输入的三个产品值分别等于product=“product\u p”、product=“product\u Q”和product=“product\u R”,则我要打印

Product_Q or Product_S
Product_P, Product_Q or Product_R
Product_P, Product_Q, Product_R, Product_S or Product_T
Product_P, Product_Q, Product_R, Product_S  or Product_T
如果输入有四个产品值,分别等于product=“product\u p”、product=“product\u Q”、product=“product\u R”和product=“product\u T”,则我要打印

Product_Q or Product_S
Product_P, Product_Q or Product_R
Product_P, Product_Q, Product_R, Product_S or Product_T
Product_P, Product_Q, Product_R, Product_S  or Product_T
如果输入有五个产品值,分别等于product=“product\u p”、product=“product\u Q”、product=“product\u R”、product=“product\u S”和product=“product\u T”,则我要打印

Product_Q or Product_S
Product_P, Product_Q or Product_R
Product_P, Product_Q, Product_R, Product_S or 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>

产品
或
产品质量
或
产品
产品
产品
请协助
提前感谢。

您可以使用递归模板完成此操作:

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

  <xsl:template name="ListProducts">
    <xsl:param name="products" />

    <xsl:choose>
      <xsl:when test="count($products) = 1">
        <xsl:value-of select="$products"/>
      </xsl:when>
      <xsl:when test="count($products) = 2">
        <xsl:value-of select="concat($products[1], ' or ', $products[2])"/>
      </xsl:when>
      <xsl:otherwise>
        <!-- output first product and recursively call with remainder -->
        <xsl:value-of select="concat($products[1], ', ')"/>
        <xsl:call-template name="ListProducts">
          <xsl:with-param name="products" select="$products[position() > 1]" />
        </xsl:call-template>
      </xsl:otherwise>
    </xsl:choose>
  </xsl:template>

  <xsl:template match="products">
    <xsl:copy>
      <xsl:call-template name="ListProducts">
        <xsl:with-param name="products" select="product" />
      </xsl:call-template>
    </xsl:copy>
  </xsl:template>
</xsl:stylesheet>

在示例XML上运行时的输出:

<products>Product_P, Product_Q, Product_R, Product_S or Product_T</products>
产品P、产品Q、产品R、产品S或产品T

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

<products>
    <product>Product_P</product>
    <product>Product_Q</product>
    <product>Product_T</product>
    </products>
<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>
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>


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

您的问题我不清楚。当你说有5种产品时,你的意思是这5种产品中总会有一些子集吗?也许这有助于解释样式表的输出与所需的输出之间的差异。输入XML会有所不同,这取决于输入XML仅显示的产品文本,如果XML输出中的五个产品应该是Product_P、Product_Q、Product_R、Product_S或Product_,您在表达需求时遇到了实际困难,因此,我建议您给我们三到四个示例输入和相应的输出。嗨@Michael Kay,我已经添加了4种XML类型,第四种类型具有不同于P、Q、R、S、T的产品类型。我需要与P、Q、R、S、T相关的输出产品。无需其他产品谢谢@JLRishe,所需的输出是相同的,这是很有帮助的,但是在我的XML产品中,我重复了在question@User515看起来你没有在问题中添加另一个输入XML。我添加了4种类型的XML。第四种类型的XML具有不同于P、Q、R、S、t的产品类型。我需要与P、Q、R、S相关的输出产品,没有其他产品