2017-11-26 9 views
0

이 블록을 삭제하거나 대처하면서이 블록을 원하는대로 출력하면서이 XMl을 다른 것으로 변환해야합니다.이 포매팅 방법을 고수 할 것입니다. 이 출력으로 다른 블록을 다른 것으로 이동 속성으로 노드 추가 및 제거

<?xml version="1.0" encoding="ISO-8859-1" ?> 
<output> 
    <cars> 
     <car> 
      <id>1</id> 
      <brand>Audi</brand> 
      <type>A3</type> 
      <license>B-01-TST</license> 
     </car> 
     <car> 
      <id>2</id> 
      <brand>Volkwagen</brand> 
      <type>Golf</type> 
      <license>IF-02-TST</license> 
     </car> 
    </cars> 
    <distances> 
     <distance> 
      <id_car>1</id_car> 
      <date>20110901</date> 
      <distance>111</distance> 
     </distance> 
     <distance> 
      <id_car>1</id_car> 
      <date>20110902</date> 
      <distance>23</distance> 
     </distance> 
     <id_car>2</id_car> 
      <date>20110901</date> 
      <distance>92</distance> 
     </distance> 
     <distance> 
      <id_car>2</id_car> 
      <date>20110902</date> 
      <distance>87</distance> 
     </distance> 
    </distances> 
</output> 

: 지금까지

<?xml version="1.0" encoding="ISO-8859-1" ?> 
<output> 
<cars> 
<car> 
    <id>1</id> 
    <brand>Audi</brand> 
    <type>A3</type> 
    <license>B-01-TST</license> 
    <distances> 
    <distance day="20110901">111</distance> 
    <distance day="20110902">23</distance> 
    </distances> 
</car> 
<car> 
    <id>2</id> 
    <brand>Volkwagen</brand> 
    <type>Golf</type> 
    <license>IF-02-TST</license> 
    <distances> 
    <distance day="20110901">92</distance> 
    <distance day="20110902">87</distance> 
    </distances> 
</car> 
</cars> 
</output> 

내가 거리가 차단 제거하고 올바른 위치에 추가 할 만 할 수 있었다, 그러나 나는 자동차/id로 조직 된 거리를 얻을 수있는 방법과 거리에 날짜를 속성으로 추가하십시오.

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

<xsl:template match="@* |node()"> 
    <xsl:copy> 
     <xsl:apply-templates select="@*|node()"/> 
    </xsl:copy> 
</xsl:template> 

<xsl:template match="distances" /> 

<xsl:template match="license"> 
    <xsl:copy-of select="."/> 
    <distances></distances> 
</xsl:template> 

</xsl:stylesheet> 

답변

1

상호 참조를 따라 키를 사용하여 다음 해당 참조 요소를 변환하는 템플릿을 쓰기 :

<?xml version="1.0" encoding="UTF-8" ?> 
<xsl:transform xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0"> 

    <xsl:strip-space elements="*"/> 
    <xsl:output indent="yes"/> 

    <xsl:key name="dist" match="distances/distance" use="id_car"/> 

    <xsl:template match="@*|node()"> 
     <xsl:copy> 
      <xsl:apply-templates select="@*|node()"/> 
     </xsl:copy> 
    </xsl:template> 

    <xsl:template match="distances" /> 

    <xsl:template match="license"> 
     <xsl:next-match/> 
     <distances> 
      <xsl:apply-templates select="key('dist', ../id)"/> 
     </distances> 
    </xsl:template> 

    <xsl:template match="distance"> 
     <distance day="{date}"> 
      <xsl:value-of select="distance"/> 
     </distance> 
    </xsl:template> 

</xsl:transform> 

http://xsltransform.net/a9GixV

+0

덕분에 여기 내가 지금까지 한 일이다 그것은 작동하는 남자!어떤 경우에 이것은 id_car이고 cars/car/id와 일치하는 key dist를 사용하고 있다는 것을 의미합니까? – orosco03

+0

키를 사용한 적이 있습니까? XSLT 프로세서는'distance' 요소의'distance' 자식들을''''''''''''''''''''''' id_car' 값을 얻은 다음'key' 함수를 사용하여 그러한 값으로'distance'를 찾을 수 있습니다. 'license' 템플릿 내부에서 우리가 사용하고자하는'id '는'key ('dist ', ../ id)를 호출 할 필요가있는 부모'car'의 일부입니다. –

+0

저는 XSL을 공부하고 있습니다. 이전에 키를 사용 해본 적이 없었기 때문에, 정말 도움이되었습니다. 고마워요! – orosco03

관련 문제