更高效的XSLT for-each方法

时间:2012-09-12 21:36:39

标签: xml xslt xslt-2.0

我有一个需要的XSLT。分隔字符串并将其拆分为两个字段以用于SQL语句:

<xsl:for-each select="tokenize(Path,'\.')">
  <xsl:choose>
    <xsl:when test="position() = 1 and position() = last()">SITE = '<xsl:value-of select="."/>' AND PATH = ''</xsl:when>
    <xsl:when test="position() = 1 and position() != last()">SITE = '<xsl:value-of select="."/>' </xsl:when>
    <xsl:when test="position() = 2 and position() = last()">AND PATH = '<xsl:value-of select="."/>' </xsl:when>
    <xsl:when test="position() = 2">AND PATH = '<xsl:value-of select="."/></xsl:when>
    <xsl:when test="position() > 2 and position() != last()">.<xsl:value-of select="."/></xsl:when>
    <xsl:when test="position() > 2 and position() = last()">.<xsl:value-of select="."/>' </xsl:when>                            
    <xsl:otherwise>zxyarglfaux</xsl:otherwise>
  </xsl:choose>                 
</xsl:for-each>

结果如下:

INPUT: North         OUTPUT: SITE = 'North' AND PATH = ''
INPUT: North.A       OUTPUT: SITE = 'North' AND PATH = 'A'
INPUT: North.A.B     OUTPUT: SITE = 'North' AND PATH = 'A.B'
INPUT: North.A.B.C   OUTPUT: SITE = 'North' AND PATH = 'A.B.C'

这很有效,但非常冗长。任何人都可以看到更有效的方法吗?

谢谢!

3 个答案:

答案 0 :(得分:2)

你真的需要标记化吗?看起来你只是在第一个时期分裂。在这种情况下,你可以做...

<xsl:text>Site = '</xsl:text>
<xsl:value-of select="substring-before(Path,'.')"/>
<xsl:text>' AND PATH = '</xsl:text>
<xsl:value-of select="substring-after(Path,'.')"/>
<xsl:text>'</xsl:text>

答案 1 :(得分:1)

这个怎么样:

<xsl:text>SITE = '</xsl:text>
<xsl:choose>
    <xsl:when test="contains($Path, '.')>
       <xsl:value-of select="substring-before($Path, '.')"/>
    </xsl:when>
    <xsl:otherwise>
       <xsl:value-of select="$Path"/>
    </xsl:otherwise>
</xsl:choose>
<xsl:text>' AND PATH = '</xsl:text>
<xsl:value-of select="substring-after($Path, '.')"/>
<xsl:text>'</xsl:text>

只需取出第一个点之前的部分并将其置于第一个条件,然后将第一个点之后的部分放入第二个条件。如果Path中没有点,则必须将其作为第一个条件的特殊情况处理,因为substring-before和-after返回一个空字符串。它不能专门针对第二个条件进行处理。

答案 2 :(得分:0)

迟到的答案,但最简单正确的XSLT 2.0解决方案是......

<xsl:value-of select="string-join( 'SITE = ', substring-before(concat(Path,'.'),'.'),
                              ' AND PATH = ', substring-after(Path,'.'), ' '), '''')" />