2012-05-04 17 views
0

XSLTを使用して従来のXMLコードをクリーンな形式に整理しています。ここに私は適切な解決策を見つけていない場合があります。開始XMLは次のようになります。XSLTを使用して隣接するXMLリストを変換する方法

<MyPoints> 
    <Values> 
    <Value X="11" Y="21" /> 
    <Value X="12" Y="22" /> 
    <Value X="13" Y="23" /> 
    </Values> 
</MyPoints> 

X_ValuesとY_Valuesは同じ要素数を持つことが保証されています。ここでは

<MyPoints> 
    <X_Values> 
    <X>11</X> 
    <X>12</X> 
    <X>13</X> 
    </X_Values> 
    <Y_Values> 
    <Y>21</Y> 
    <Y>22</Y> 
    <Y>23</Y> 
    </Y_Values> 
</MyPoints> 

は私が取得したいものです。私は3D点でもこれをやってみたいですが、それは解決策のほんの一例です。

可能であれば、XSLT 1.0は良いでしょう。

+0

あなたの編集について:私の前の答えは私の更新を参照して、ゴミでした。 – bitmask

+0

更新いただきありがとうございます。私は自分の家に帰って、ポジションの2番目の使用が私には意味をなさないと気付きました... –

答えて

1

position()を使用すると、このトリックを行う必要があります。関連部分:

<xsl:for-each select="/MyPoints/X_Values/X"> 
    <xsl:variable name="i"><xsl:value-of select="position()" /></xsl:variable> 
    <Value X="{.}" Y="{/MyPoints/Y_Values/Y[position()=$i]}" /> 
</xsl:for-each> 

フルスタイルシート:

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet 
    version="1.0" 
    xmlns="http://www.w3.org/1999/xhtml" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns:fn="http://www.w3.org/2005/xpath-functions" 
> 
    <xsl:output 
    method="xml" 
    version="1.0" 
    indent="yes" 
    doctype-public="-//W3C//DTD XHTML 1.1//EN" 
    doctype-system="http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd" 
    /> 

<xsl:template match="/"> 
<MyPoints><Values> 
<xsl:for-each select="/MyPoints/X_Values/X"> 
    <xsl:variable name="i"><xsl:value-of select="position()" /></xsl:variable> 
    <Value X="{.}" Y="{/MyPoints/Y_Values/Y[position()=$i]}" /> 
</xsl:for-each> 
</Values></MyPoints> 
</xsl:template> 

</xsl:stylesheet> 
+0

素早く答えてくれてありがとう!私はposition()が実際にどのように動作するかについての明確な文書を見つけることができませんでしたが、これは今より多くの意味があります。今すぐ試してみましょう。 –

+0

更新されたソリューションは完全に機能します。適切な相対XPathを得るためには、 'Y = {../../Y_values/Y [position()= $ i]' 'のように2つのレベルに戻る必要があります。 –

関連する問題