1

我有一个 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'

这有效,但非常冗长。谁能看到更有效的方法?

谢谢!

4

3 回答 3

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>
于 2012-09-12T21:46:41.020 回答
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>

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

于 2012-09-12T21:47:05.463 回答
0

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

<xsl:value-of select="string-join( 'SITE = ', substring-before(concat(Path,'.'),'.'),
                              ' AND PATH = ', substring-after(Path,'.'), ' '), '''')" />
于 2012-09-13T01:45:45.123 回答