XSLT를 사용하는 식별자 만있는 요소의 하위 집합 인 정보를 얻고 정렬하는 방법은 무엇입니까?

StackOverflow https://stackoverflow.com/questions/2418515

  •  19-09-2019
  •  | 
  •  

문제

저는 XSLT를 처음 사용하고 다음과 같은 문제를 해결할 수 없습니다.

다음과 같은 XML 파일이 있습니다.

<root>
    <subset>
        <e id="A"></e>
        <e id="C"></e>
    </subset>

    <data>
        <info id="A" order="3" name="ANode"></info>
        <info id="B" order="4" name="BNode"></info>
        <info id="C" order="1" name="CNode"></info>
        <info id="D" order="2" name="DNode"></info>
    </data>
</root>

그리고 나는 이것을 생산하고 싶습니다 :

<root>
    <newnode id="C" order="1" name="CNode"></newnode>
    <newnode id="A" order="3" name="ANode"></newnode>
</root>

보시다시피, 아이디어는 각 정보를 검색하여 ID의 하위 집합을 "완료"하는 것입니다. <data>.

그것을주의해라 <data> 어린이 노드가 많아야합니다.

또한 노드를 <data> ID의 하위 집합의 요소는 많은 서브 세트가 있고 "어디서나"반복 된 정보를 원하지 않기 때문에.

미리 감사드립니다.

도움이 되었습니까?

해결책

실제 데이터와 관련하여 필요한 다른 작업에 따라 서브 세트에서 키를 벗을 수도 있습니다.

<xsl:output indent="yes" />

<xsl:key name="subset" match="e" use="@id" />

<xsl:template match="/">
    <root>
    <xsl:for-each select="//info[count(key('subset',@id)[1]) &gt; 0]">
        <xsl:sort select="@order" data-type="number" />
        <newnode id="{@id}" order="{@order}" name="{@name}" />
    </xsl:for-each>
    </root>
</xsl:template>

다른 팁

상호 참조는 키를 사용하도록 요청합니다.

<xsl:stylesheet
  xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
  version="1.0">

  <xsl:output indent="yes"/>

  <xsl:key name="k1" match="info" use="@id"/>

  <xsl:template match="root">
    <xsl:copy>
      <xsl:apply-templates select="subset/e">
        <xsl:sort select="key('k1', @id)/@order" data-type="number"/>
      </xsl:apply-templates>
    </xsl:copy>
  </xsl:template>

  <xsl:template match="e">
    <newnode id="{@id}" order="{key('k1', @id)/@order}" name="{key('k1', @id)/@name}"/>
  </xsl:template>

</xsl:stylesheet>

그것은 당신이 제시 한 입력 샘플에 대해해야합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top