XSLT验证和连接多个变量
在验证多个变量之后,我必须验证并连接多个变量XSLT验证和连接多个变量,xslt,xslt-1.0,Xslt,Xslt 1.0,在验证多个变量之后,我必须验证并连接多个变量 <xsl:variable name="val1" select="//xpath"/> <xsl:variable name="val2" select="//xpath"/> <xsl:variable name="val3" select="//xpath"/> <xsl:variable name="val4" select="//xpath"/> <xsl:variable name="
<xsl:variable name="val1" select="//xpath"/>
<xsl:variable name="val2" select="//xpath"/>
<xsl:variable name="val3" select="//xpath"/>
<xsl:variable name="val4" select="//xpath"/>
<xsl:variable name="val5" select="//xpath"/>
XSLT有一个函数
concat(string, string, ...)
可以在另一个变量的select=
属性中使用
<xsl:variable name="vals" select="{concat($val1,$val2,$vl3,$val4,$val5)}"/>
或者任何允许使用属性值模板的地方(在大括号中)。这可能有用:
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="text"/>
<xsl:template match="/*">
<xsl:variable name="vMyVars">
<xsl:apply-templates select="Address | Address1 | City | State | Zipcode" mode="vMyVars"/>
</xsl:variable>
<xsl:value-of select="substring($vMyVars, -1, string-length($vMyVars))"/>
</xsl:template>
<xsl:template match="*" mode="vMyVars"/>
<xsl:template match="*[normalize-space()]" mode="vMyVars">
<xsl:value-of select="."/>
<xsl:text>, </xsl:text>
</xsl:template>
</xsl:stylesheet>
对于此XML:
<elems>
<Address>test</Address>
<Address1>test2</Address1>
<City>test3</City>
<State>test4</State>
<Zipcode>test5</Zipcode>
</elems>
<elems>
<Address1>test2</Address1>
<City> </City>
<State>test4</State>
<Zipcode></Zipcode>
</elems>
在XSLT2.0中:
stringjoin((地址、地址1、城市、州、Zipcode),“,”)
在XSLT 1.0中,如果按文档顺序输出结果:
<xsl:for-each select="Address | Address1 | City | State | Zipcode">
<xsl:if test="position() != 1">, </xsl:if>
<xsl:value-of select="."/>
</xsl:for-each>
,
如果不是按文档顺序,那么与XSLT1.0中的许多内容一样,它可能相当乏味。XSLT1.0解决方案保留表达式顺序(
xsl:sort
指令)并使用Becker方法(substring()
第二个参数):
不能使用XSLT2.0是一件痛苦的事情。。。看,多么简单
<xsl:value-of
select="Address, Address1, City, State, Zipcode"
separator=", "/>
注意:XPath 2.0序列具有隐含的构造顺序。由于XSLT 2.0
xsl:value of
指令句柄序列,现在有了一个@分隔符
,谢谢,但我想验证每个变量,比如它们是否有值,然后连接起来。如果一个或多个无效,您想怎么办?我们需要更多关于您想要完成的任务的信息。例如:我想要连接四个值,如:Address、Address1、City、State和Zipcode。如果地址丢失,我将得到如下输出:“address1,city,state,zipcode”。我想去掉第一个逗号。xsl:variable/@select
不能是AVT。这需要动态XPath评估…您在这里谈论的是什么样的验证?通常情况下,验证是在开始执行转换之前应用于输入文档的东西。我怀疑是否需要升级投票,尽管我已经升级了(+1:),但这是一种我不想在大型非单独项目中看到的代码:/尽管保留顺序有时非常方便。@Flack:可能吧。但请注意,即使在SO中,这个成语也有一些用法。@Alejandro,我自己不喜欢使用OB方法。当然,我不能说使用它是错误的:)@Flack:噢!关于这一点,我完全同意。这只是一个例子。。。尽管在仅限XPath1.0的环境中,它可能很方便
test2, test4
<xsl:for-each select="Address | Address1 | City | State | Zipcode">
<xsl:if test="position() != 1">, </xsl:if>
<xsl:value-of select="."/>
</xsl:for-each>
<xsl:for-each select="Address|Address1|City|State|Zipcode">
<xsl:sort select="substring-before(
'|Address|Address1|City|State|Zipcode|',
concat('|',name(),'|')
)"/>
<xsl:value-of select="concat(
substring(
', ',
1 div (position()!=1)
),
.
)"/>
</xsl:for-each>
<xsl:value-of
select="Address, Address1, City, State, Zipcode"
separator=", "/>