我有一个需要的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'
这很有效,但非常冗长。任何人都可以看到更有效的方法吗?
谢谢!
答案 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,'.'), ' '), '''')" />