1

をとるXSLTがあります。文字列を削除し、SQLステートメントの2つのフィールドに分割します。

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

最初のドットの前の部分を取り、それを最初の状態にし、次に最初のドットの後の部分を2番目の状態にします。パスにドットがない場合、これは最初の条件の特殊なケースとして処理する必要があります。これは、substring-beforeおよび-afterが空の文字列を返すためです。2番目の条件では特に処理する必要はありません。

于 2012-09-12T21:47:05.463 に答える
0

遅い答えですが、最も単純な正しいXSLT2.0ソリューションは...

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