2016-10-05 6 views
0

私はXSLTの完全な初心者ですので、ループに関連する他の問題の解決策が私の問題ではうまくいく場合は申し訳ありませんが、XSLT for-eachループで2つの要素が繰り返されます

Iは、次のような複数のノードを持つXMLファイルを持っている:

<Roles> 
    <Role>User</Role> 
    <Purpose>General User</Purpose> 
    <Role>Staff</Role> 
    <Purpose>Company Staff</Purpose> 
    <Role>Admin</Role> 
    <Purpose>Administration</Purpose> 
</Roles> 

Iは、これらのノードと一致<目的>と共にプリント<役割>をループする必要が。私はのための-eachループを使用している場合しかし、それは<役割>の罰金を繰り返し処理が、それぞれに同じ<目的>(ちょうど最初の役割/目的の要素を出力します。

を、私はそれらを同期することができますどのような方法があります-ため、各ループはその2回目の繰り返しであるときに、たとえば、それは二<役割と一緒に二<目的>を選ぶ、というよう>がそう、それはこのような何か?

User - General User 
Staff - Company Staff 
Admin - Administration 

を終わるまで、私はされています次のようなparamsを使ってみても、 "with-param with要素はありませんその文脈の中でllowed "(おそらく私はXSLTの理解が間違っていることを理解していない)と言っていた。一般ユーザー< /ロール>による迷惑なフォーマット上の理由ではなく、誰もが、ループへの代替を考えることができればこれはうまくいく -

<xsl:param name="i" select="1"/> 

私はつまり、私はちょうど<役割に>ユーザーを行うことができない(個別の要素を維持する必要があります同様に、私はそれをお願い申し上げます

+0

どのバージョンを使用している場合は? –

+0

現時点ではバージョン1.0ですが、2.0を使用できる可能性があります。 PHPを使用して.docxファイルを作成していますので、使用できるバージョンが制限されているかどうかはわかりません。残念ながら、xsl:paramでエラーを解決する場合にバージョン2.0として設定しようとしました。 –

+0

"* とその一致 *との印刷はかなり意味がありません。変換の予想される出力をコードとして追加してください。 –

答えて

0

使用following-siblingような何か:。。

<xsl:for-each select="Role"> 
    <xsl:value-of select="."/> 
    <xsl:text> - </xsl:text> 
    <xsl:value-of select="following-sibling::Purpose[1]"/> 
    <xsl:text>&#xa;</xsl:text> 
</xsl:for-each> 

XSLT 1.0でのみ動作します(コメントDaniel Haleyを参照)。

+1

OPがXSLT 2.0に切り替わると、 'following-sibling :: Purpose'が意図した以上に出力されることになることに注意してください(後続する各兄弟目的の値)。 –

+0

パーフェクト!ありがとう、次の兄弟は私が探していたものです。私の前の検索からそれを見つけられなかったのですが、まさに私が必要だったものです –

1

これは、following-sibling:: axisを使用して行うことができます。あなたは、次の最初のPurpose兄弟を選択します。

xsl:for-eachを使用して答えは(ので、ここでxsl:apply-templatesを使用して1つの...

XML入力

<Roles> 
    <Role>User</Role> 
    <Purpose>General User</Purpose> 
    <Role>Staff</Role> 
    <Purpose>Company Staff</Purpose> 
    <Role>Admin</Role> 
    <Purpose>Administration</Purpose> 
</Roles> 

XSLT 1.0

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:output indent="yes"/> 
    <xsl:strip-space elements="*"/> 

    <xsl:template match="Roles"> 
    <xsl:copy> 
     <xsl:apply-templates select="Role"/>  
    </xsl:copy> 
    </xsl:template> 

    <xsl:template match="Role"> 
    <xsl:copy> 
     <xsl:value-of select="concat(., ' - ', following-sibling::Purpose[1])"/>  
    </xsl:copy> 
    </xsl:template> 

</xsl:stylesheet> 

出力だ、まだありませんシュ電子あなたが指定されていませんでしたので、これはあなたが望む出力ですが、それは、少なくとも概念を示している)あなたは、XSLTの

<Roles> 
    <Role>User - General User</Role> 
    <Role>Staff - Company Staff</Role> 
    <Role>Admin - Administration</Role> 
</Roles> 
関連する問題