2017-10-27 4 views
0

ファイルパス(例:/ dir1/dir2/dir3)を含む属性をトークン化したので、今は文字列の配列(またはノードセット?)を持っています。XSLT:文字列の配列で次の兄弟を使用していますか?

私は最初のアイテムを再帰的に処理し、残りの部分を渡したいと思います。これを 'following-sibling'軸を使用して実現したいと考えていました。しかし、文字列だけではなく、実際の要素を期待していることが分かります。私は現在、想像

<xsl:template match="s:universe"> 
    <xsl:call-template name="createSubFolder"> 
     <xsl:with-param name="folderNames" select="tokenize(@path, '/')" /> 
    </xsl:call-template> 
</xsl:template> 

<xsl:template name="createSubFolder"> 
    <xsl:param name="folderNames" /> 
    <xsl:if test="count($folderNames) > 0"> 
     <folder> 
      <xsl:attribute name="name" select="$folderNames[1]" /> 
      <xsl:if test="position() &lt; count($folderNames)"> 
       <folder> 
        <xsl:call-template name="createSubFolder"> 
         <xsl:with-param name="folderNames" select="$folderNames[1]/following-sibling::text()" /> 
        </xsl:call-template> 
       </folder> 
      </xsl:if> 
     </folder> 
    </xsl:if> 
</xsl:template> 

唯一の解決策は、テンプレートへの配列のテールエンドを供給するカスタム関数を作成することになる - しかし、私は/より良い方法がなければならないことができると感じています。

+1

トークン化 'で(@path、「/」)'あなたは文字列のシーケンスを取得し、あなたはその後、再帰的に処理する場合あなたは、(XPath 3) 'tail($ folderNames)'や '$ folderNames [position()gt 1]'(XPath 2)でtailを使用するのは正しいです。 –

+0

@MartinHonnen:テールが存在していなかった。それを与えるだろう! – morsor

+0

http://maxtoroq.github.io/xpath-ref/にブックマークします。 –

答えて

1

コメントにマーティン・ホーネンが言及したように、tokenize(@path, '/')はストリングのシーケンスを返します。したがって、following-sibling軸を文字列型に使用することはできません。

あなたは次のような再帰呼び出しを使用するsubsequence($folderNames,2)$folderNames[position() gt 1]を使用することができます。

<xsl:template name="createSubFolder"> 
    <xsl:param name="folderNames" as="xs:string*"/> 
    <xsl:if test="exists(($folderNames[1]))"> 
     <folder> 
      <xsl:attribute name="name" select="$folderNames[1]" /> 
      <xsl:call-template name="createSubFolder"> 
       <xsl:with-param name="folderNames" select="subsequence($folderNames,2)"/> 
      </xsl:call-template> 
     </folder> 
    </xsl:if> 
</xsl:template> 
+0

サブシーケンス()を使用する - 非常にいいです。私は '配列'のためのグーグルであったはずだったときに私は '配列'のためにグーグルでいた! – morsor

関連する問題