使用 XSLT 根据条件文本之间的位置添加逗号 (,) 或 "or"
Adding comma(,) or "or" in depending on position in between conditional text using XSLT
我有 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>
if input xml 2 products repeated:
<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_Q",我想简单地打印
Product_Q
如果输入有两个产品值等于产品="Product_Q"和产品="Product_S",我想打印
Product_Q or Product_S
如果输入有三个产品值等于产品="Product_P"、产品="Product_Q"和产品="Product_R",我想打印
Product_P, Product_Q or Product_R
如果输入有四个产品值等于产品="Product_P"、产品="Product_Q"、产品="Product_R"和产品="Product_T",我想打印
Product_P, Product_Q, Product_R, Product_S or Product_T
如果输入有五个产品值等于产品="Product_P"、产品="Product_Q"、产品="Product_R"、产品="Product_S" 和产品="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>
第一步是识别不同的产品:
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 个产品产品 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>
if input xml 2 products repeated:
<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_Q",我想简单地打印
Product_Q
如果输入有两个产品值等于产品="Product_Q"和产品="Product_S",我想打印
Product_Q or Product_S
如果输入有三个产品值等于产品="Product_P"、产品="Product_Q"和产品="Product_R",我想打印
Product_P, Product_Q or Product_R
如果输入有四个产品值等于产品="Product_P"、产品="Product_Q"、产品="Product_R"和产品="Product_T",我想打印
Product_P, Product_Q, Product_R, Product_S or Product_T
如果输入有五个产品值等于产品="Product_P"、产品="Product_Q"、产品="Product_R"、产品="Product_S" 和产品="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>
第一步是识别不同的产品:
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>
注意:您的要求仍然没有说明所需的输出顺序。