如果字符串在变量1中不可用且在变量2中可用,则多个串联字母表

时间:2014-05-01 15:16:41

标签: xslt xslt-1.0

我在xslt中有两个变量,例如名为var1和var2。

  

Var1 = A,B,C,D,F G,H Var2 = L,M,F,C,D,K

我想检查一下Var1中是否存在任何字母并出现在Var2中,请在Var1之后添加此字母。 意味着我最终想要存储在var1

中的值
  

A,B,C,d,F,G,H,L,M,K

我在想下面的东西不起作用 -

<xsl:variable name="Var1">
  <xsl:if test="not(contains($va1,'L'))">
  <xsl:value-of select="concat($va1, 'L')"/>
   </xsl:if>
<xsl:if test="not(contains($va1,'M'))">
  <xsl:value-of select="concat($va1, 'M')"/>
 </xsl:if>
 </xsl:variable>

注意 - 我是XSLT的初学者,上面的代码只是我头脑中的东西而没有尝试过,所以请不要投票。

1 个答案:

答案 0 :(得分:0)

可能在某种程度上,,不保留$var2

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output method="text"/>

  <xsl:variable name="var1">
    <xsl:text>A,B,C,D,F,G,H</xsl:text>
  </xsl:variable>

  <xsl:variable name="var2">
    <xsl:text>L,M,F,C,D,K</xsl:text>
  </xsl:variable>

  <xsl:variable name="merged" select="concat(concat($var1, ','), translate($var2, $var1, ''))"/>

  <xsl:template match="@* | node()">
    <xsl:apply-templates select="/"/>
  </xsl:template>

  <xsl:template match="/">
    <xsl:value-of select="$merged"/>
  </xsl:template>
</xsl:stylesheet>

<强>输出:

A,B,C,D,F,G,H,LMK

请注意,对于XSLT 1.0,它只能用于示例中的单个字符(translate不能替换子字符串!)。

如果您不需要变量中的合并字符,则可以执行以下操作:

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output method="text"/>

  <xsl:variable name="sep" select="','"/>

  <xsl:variable name="var1">
    <xsl:text>A,B,C,D,F,G,H</xsl:text>
  </xsl:variable>

  <xsl:variable name="var2">
    <xsl:text>L,M,F,C,D,K</xsl:text>
  </xsl:variable>

  <xsl:template match="@* | node()">
    <xsl:apply-templates select="/"/>
  </xsl:template>

  <xsl:template match="/">
    <xsl:value-of select="$var1"/>
    <xsl:value-of select="$sep"/>
    <xsl:call-template name="not-contained">
      <xsl:with-param name="string1" select="$var1"/>
      <xsl:with-param name="string2" select="$var2"/>
    </xsl:call-template>
  </xsl:template>

  <xsl:template name="not-contained">
    <xsl:param name="string1"></xsl:param>
    <xsl:param name="string2"></xsl:param>
    <xsl:param name="sep" select="$sep"/>
    <xsl:param name="match"/>
    <xsl:value-of select="$match"/>
    <xsl:choose>
      <xsl:when test="contains($string2, $sep)">
        <xsl:variable name="before" select="substring-before($string2, $sep)"/>
        <xsl:variable name="no-match" select="not(contains($string1, $before))"/>
        <xsl:if test="$no-match">
          <xsl:value-of select="$before"/>
        </xsl:if>
        <xsl:call-template name="not-contained">
          <xsl:with-param name="string1" select="$string1"/>
          <xsl:with-param name="string2" select="substring-after($string2, $sep)"/>
          <xsl:with-param name="match">
            <xsl:if test="$no-match">
              <xsl:value-of select="$sep"/>
            </xsl:if>
          </xsl:with-param>
        </xsl:call-template>
      </xsl:when>
      <xsl:otherwise>
        <xsl:if test="not(contains($string1, $string2))">
          <xsl:value-of select="$string2"/>
        </xsl:if>
      </xsl:otherwise>
    </xsl:choose>
  </xsl:template>

</xsl:stylesheet>

<强>输出:

A,B,C,D,F,G,H,L,M,K

如果每个字母都是源文档中的文本节点,则可以使用<xsl:key>将它们组合在一起,从而消除重复。