如果字母表在变量1中不可用并且在变量2中可用,则对字母表进行多重级联

  • 本文关键字:变量 字母表 级联 如果 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初学者,上面的代码只是我脑子里的东西,还没有尝试过,所以请不要投反对票。

在某种程度上是可能的,但,没有为$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

请注意,使用XSLT1.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>将它们分组在一起,从而消除重复。

相关内容

  • 没有找到相关文章

最新更新