2012-05-04 3 views
0

저는 XSLT를 사용하여 일부 기존 XML 코드를 더 깨끗한 형식으로 정리했습니다. 다음은 적절한 해결 방법을 찾지 못한 경우입니다. 시작 XML은 다음과 같습니다XSLT를 사용하여 인접한 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 점에서도이 작업을 수행하려고합니다. 그러나 이는 솔루션의 사소한 확장 일 것입니다.

가능하면 XSLT 1.0이 좋습니다.

+0

당신의 편집에 관한 : 내 이전의 대답은 내 업데이 트를 참조 쓰레기했다. – bitmask

+0

업데이트 해 주셔서 감사합니다. 나는 집으로가는 길에 두 번째로 사용 된 위치가 나에게 아무런 의미가 없다는 것을 깨달았다. –

답변

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] '와 같이 두 단계를 거쳐야한다는 점에 유의해야합니다. –

관련 문제