2014-05-15 2 views
1

XSLT를 처음 사용했습니다. 지정된 속성을 기반으로 기존 XML 문서를 다시 작성 (복사)하려고합니다. 예를 들어 XML 필터링 용 XSLT

는 아래의 XML로, 나는 속성 태그가 교훈을 얻고 싶은 = "6"예상과 그룹 = "Book1을"

<Groups> 
<mainGroup id="1" group="Book1"> 
<subGroup name="Chapter 1"> 
    <lesson name="Lesson1" tags="1" /> 
    <lesson name="Lesson2" tags="2" /> 
</subGroup> 
<subGroup name="Chapter 2"> 
    <lesson name="Lesson1" tags="3" /> 
    <lesson name="Lesson2" tags="4" /> 
</subGroup> 
<subGroup name="Chapter 3"> 
    <subGroup name="Chapter 3 Examples"> 
     <lesson name="Lesson2" tags="5" /> 
    </subGroup> 
    <lesson name="Lesson1" tags="6" /> 
</subGroup> 
</mainGroup> 
<mainGroup id="1" group="Book2"> 
<subGroup name="Chapter 1"> 
    <lesson name="Lesson1" tags="1" /> 
    <lesson name="Lesson2" tags="2" /> 
</subGroup> 
<subGroup name="Chapter 2"> 
    <lesson name="Lesson1" tags="3" /> 
    <lesson name="Lesson2" tags="4" /> 
</subGroup> 
<subGroup name="Chapter 3"> 
    <subGroup name="Chapter 3 Examples"> 
     <lesson name="Lesson2" tags="6" /> 
    </subGroup> 
    <lesson name="Lesson1" tags="5" /> 
</subGroup> 
</mainGroup> 
</Groups> 

의 속성을 가지고 mainGroup에서 (예상) 아래 후 XSL의 결과로 지금까지 XSL 등

<Groups> 
<mainGroup id="1" group="Book1"> 
<subGroup name="Chapter 3"> 
    <lesson name="Lesson1" tags="6" /> 
</subGroup> 
</mainGroup> 
</Groups> 

을 적용, 지금까지 함께 왔어요 가장 가까운 내가 입수 한 것입니다 :

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:output method="xml" indent="yes" encoding="UTF-8"/> 
<xsl:strip-space elements="*"/> 


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


// Remove all maingroups that are not book1 
<xsl:template match="mainGroup[not(@group='Book1')]" /> 

// Remove all lessons that do not have tags of 5 
<xsl:template match="lesson[not(@tags='5')]" /> 

</xsl:stylesheet> 
,536,913,632 내가 해봤 어떤 일이 (다시 웃음하지 마십시오

- - 새로운 지금 비어있는 하위 그룹을 제거하는 방법을 알아낼 수 없습니다

<Groups> 
    <mainGroup id="1" group="Book1"> 
     <subGroup name="Chapter 1" /> 
     <subGroup name="Chapter 2" /> 
     <subGroup name="Chapter 3"> 
     <subGroup name="Chapter 3 Examples"> 
      <lesson name="Lesson2" tags="5" /> 
     </subGroup> 
     </subGroup> 
    </mainGroup> 
</Groups> 

: 나에게의 XML 결과를 제공 10

이 XSL :))

에 희망이 교훈 노드를 가지고 있지 않은 자들을 제거 -하지만 무엇을 할 것 같지 않았다

<xsl:template match="subGroup[count(lesson) = 0]" /> 

<xsl:template match="subGroup[not(node())]" /> 

및 이 같은도 뭔가 ---

<xsl:template match="subGroups" mode="copy"> 
    <xsl:choose> 
     <xsl:when test="count(./*)"> 
     <xsl:copy> 
      <xsl:apply-templates select="@*|node()" mode="copy"/> 
     </xsl:copy> 
     </xsl:when> 
     <xsl:otherwise> 
     </xsl:otherwise> 
    </xsl:choose> 
    </xsl:template> 

그러나 나는 수건을 던지고있어 성공없이 시간 후

이 - 아, 당신은 단지 추가하거나 할 필요가 - 나는 누군가가 여기에 아마이 생각을 읽고 확신 이 - 그래서 어떤 도움을 주시면 감사하겠습니다.

감사

답변

1

중요한 것은이 입력 XML에 대한 해당 템플릿 규칙 일치, 그래서 당신은 교훈을 포함하지 않는 subGroup 요소 당신이 원하는 억제해야 :

<xsl:template match="subGroup[not(.//lesson/@tags = '5')]"/> 

의 경우를 소그룹이 궁극적으로 비어있는 규칙이 더 복잡하면 2 단계 변환을 더 쉽게 수행 할 수 있습니다. 현재 수행중인 첫 번째 패스와 첫 번째 패스의 결과를 처리하는 두 번째 패스가 있습니다. 나머지 빈 태그를 제거하십시오. XSLT 2.0에서는이

<xsl:variable name="pass1"> 
    <xsl:apply-templates /> 
</xsl:variable> 
<xsl:apply-templates select="$pass1" mode="pass2"/> 

간단하지만 1.0에서는 node-set 확장 기능을 필요로합니다. 당신은 그 경로를 가고 싶다면 다른 질문에서이 기법의 예제를 많이 찾을 수 있습니다.

1

모든 것을 도매로 구매하지 않고 필요없는 것을 없애고 대신 처음부터 필요로하는 것을 선택하십시오.

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/> 

<xsl:template match="/Groups"> 
    <xsl:copy> 
     <xsl:apply-templates select="mainGroup[@group='Book1']"/> 
    </xsl:copy> 
</xsl:template> 

<xsl:template match="mainGroup"> 
    <xsl:copy> 
     <xsl:copy-of select="@*"/> 
     <xsl:apply-templates select="subGroup[lesson[@tags='6']]"/> 
    </xsl:copy> 
</xsl:template> 

<xsl:template match="subGroup"> 
    <xsl:copy> 
     <xsl:copy-of select="@*"/> 
     <xsl:copy-of select="lesson[@tags='6']"/> 
    </xsl:copy> 
</xsl:template> 

</xsl:stylesheet> 

또는, 당신이 선호하는 경우 :

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/> 

<xsl:template match="/"> 
    <Groups> 
     <xsl:for-each select="Groups/mainGroup[@group='Book1']/subGroup/lesson[@tags='6']"> 
      <mainGroup> 
       <xsl:copy-of select="../../@*"/> 
       <subGroup> 
        <xsl:copy-of select="../@*"/> 
        <xsl:copy-of select="."/> 
       </subGroup> 
      </mainGroup> 
     </xsl:for-each> 
    </Groups> 
</xsl:template> 

</xsl:stylesheet>