2017-04-10 7 views
0

私はXSLT(2.0)を使い慣れていないため、次のような状況に遭遇しました。 別のXSLT変換の結果を使用する

  1. 変更

    elemNameX
  2. newelemNameXに変更し、すべての<something>typeから<subel1>を含むすべての<elem>要素の属性名:

    <root> 
        <elem name="elemName1"> 
         <subel1>value</subel1> 
         <subel1>value2</subel1> 
        </elem> 
        <elem name="elemName2"> 
         <subel1>value</subel1> 
         <subel1>value2</subel1> 
        </elem> 
        <elem name="elemName3"> 
         <subel2>value</subel2> 
         <subel2>value2</subel2> 
        </elem> 
    
        <referencing> 
         <something type="elemName1"/> 
        </referencing> 
        <referencing> 
         <something type="elemName2"/> 
        </referencing> 
        <referencing> 
         <something type="elemName3"/> 
        </referencing> 
    </root> 
    

    が、私は二つのことを必要とする:私はこのようなXML入力を持っていますこれらの新しい名前を参照する属性。

私が最初のステップを行うことができたが、私はすべての\\something\@typeを通過すると\\elem[@name='newelemX']を見つけようと考えていた第二

で苦労しています。しかし、最初のステップで変更された<elem>とは一致しません。

それは別のテンプレート内の1つのテンプレートの結果と一致することは可能ですか?

+0

あなたは一例で提示した以外の属性を気にする必要がありますか?具体的には、あなたが描いていない「」や「」要素の属性をコピーする必要がありますか? –

+0

あなたのサンプルXMLは、 ' '要素が閉じられていないため、形式が整っていません。私はそれらの開始タグのいくつかが終了タグであることを意図していたと仮定します。 –

+0

はい、「」には、他にも必要な属性があります。 (は実際に、私は名前 'newelemNameX'とIと' 'を新しい要素を作成しています。私の例よりも実際にはもう少し複雑である' 'newelemNameX'からelemNameX'参照するが、私はこの部分を解決しているので、私は単純化質問)。 – Kejml

答えて

0

私はすべて\何か\の@typeを通過すると \ elemは[名@ = 'newelemX']を検索しようと考えていました。しかし、私は の最初のステップで作成された変更と一致することはできません。

1つのテンプレートの結果を異なるテンプレートに一致させることは可能ですか?

テンプレートを評価した結果を変数に割り当ててからyesにすると、(XSLT 2.0では)可能です。たとえば、変数に記録されたノードシーケンスにテンプレートを適用することで、これを実行できます。しかし、ロジックの重複を少しでも許そうとするならば、そのような問題に行く必要はありません。あなたも、XSLT 1.0でそれを行うことができます。

<xsl:stylesheet version="1.0" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 

    <!-- Identity transform for where there is no more specific match --> 
    <xsl:template match="node()|@*"> 
    <xsl:copy> 
     <xsl:apply-templates select="node()|@*" /> 
    </xsl:copy> 
    </xsl:template> 

    <!-- modified "name" attributes for certain "elem" elements -->  
    <xsl:template match="elem[subel1]/@name"> 
    <xsl:attribute name="name">new<xsl:value-of select="."/></xsl:attribute> 
    </xsl:template> 

    <!-- "type" attributes of "something" elements -->  
    <xsl:template match="something/@type"> 
    <!-- need to capture the current value for use in a test expression --> 
    <xsl:variable name="current_value" select="." /> 
    <xsl:attribute name="type"> 
     <!-- insert "new" into the value where needed (logic duplicated here) --> 
     <xsl:if test="/descendant::elem[@name=$current_value]/subel1">new</xsl:if> 
     <xsl:value-of select="."/> 
    </xsl:attribute> 
    </xsl:template> 

</xsl:stylesheet> 
+0

すごい、ありがとう!私は ''と書いて、変更を加える前に元の文書とマッチさせることができたとは思っていませんでした。 – Kejml

関連する問題