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>
将它们分组在一起,从而消除重复。