Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/xslt/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
XSLT验证和连接多个变量_Xslt_Xslt 1.0 - Fatal编程技术网

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=", "/>