XSLT验证和连接多个变量

时间:2011-02-09 05:32:05

标签: 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="val5" select="//xpath"/>

是否有可用于此的模板,或任何人都可以帮助我这样做。

从评论中更新

我想连接五个这样的值:Address, Address1, City, State, Zipcode。如果缺少Address,我会得到类似“, address1, city, state, zipcode”的输出。我想摆脱第一个逗号。

<xsl:variable name="__add" select="translate(//*/text()[contains(., 'Address')]/following::td[contains(@class, 'fnt')][1], ',', '')"/>

<xsl:variable name="address">
    <xsl:for-each select="$__add | //*/text()[contains(., 'City')]/following::td[contains(@class, 'fnt')][1] | //*/text()[contains(., 'State')]/following::td[contains(@class, 'fnt')][1] | //*/text()[contains(., 'Pincode')]/following::td[contains(@class, 'fnt')][1]">
        <xsl:value-of select="concat(substring(', ', 1 div (position()!=1)), .)"/>
    </xsl:for-each>
</xsl:variable>

4 个答案:

答案 0 :(得分:7)

在XSLT 2.0中:string-join((Address, Address1, City, State, 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>

如果不是按文档顺序排列,那么就像XSLT 1.0中的许多内容一样,它可能相当繁琐。

答案 1 :(得分:6)

XSLT有一个功能

concat(string, string, ...)

您可以在另一个变量的select=属性中使用

<xsl:variable name="vals" select="{concat($val1,$val2,$vl3,$val4,$val5)}"/>

或允许使用属性值模板的任何地方(花括号中)。

答案 2 :(得分:1)

XSLT 1.0解决方案保留表达式顺序(xsl:sort指令)并使用Becker的方法(substring()第二个参数):

<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> 

你不能使用XSLT 2.0是一种痛苦......看起来有多简单!

<xsl:value-of 
     select="Address, Address1, City, State, Zipcode"
     separator=", "/>

注意:XPath 2.0序列具有隐式构造顺序。由于XSLT 2.0 xsl:value-of指令处理序列,现在有一个@separator

答案 3 :(得分:0)

可能会有所帮助:

<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>

结果将是:

test, test2, test3, test4, test5

对于这个XML:

<elems>
    <Address1>test2</Address1>
    <City>       </City>
    <State>test4</State>
    <Zipcode></Zipcode>
</elems>

结果将是:

test2, test4