0

私はXSLTを使用して、いくつかのレガシーXMLコードをよりクリーンな形式にクリーンアップしてきました。これは私が適切な解決策を見つけられなかったケースです。開始XMLは次のようになります。

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

これが私が欲しいものです:

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

X_ValuesとY_Valuesは、同じ数の要素を持つことが保証されています。3Dポイントに対してもこれを実行したいのですが、これはソリューションの簡単な拡張である必要があります。

可能であれば、XSLT1.0がいいでしょう。

4

1 に答える 1

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>
于 2012-05-04T23:35:19.927 に答える