2014-12-08 3 views
0

을 선택 나는 같은 XML 파일이 있습니다. 일부 파일에는 이름이 "dummy"인 작업이 포함되어 있거나 포함되어 있지 않을 수 있습니다. 결국 변환 된 파일은 다음과 같이 보입니다.XSLT 필터와 첫 번째 요소

<work> 
    <job name="unit1"> 
    <task>abc</task> 
    <user>def</user> 
    </job> 
</work> 

xslt를 필터링하고 선택하려면 어떻게해야합니까?

답변

2

당신은

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

<xsl:template match="job[@name = 'dummy'] | job[not(@name = 'dummy')][position() > 1]"/> 
2

가장 간단한 방법은이 오히려 유지하려는 것보다 무시하고 싶은 생각하는 것보다 큰 변화의 일부인 경우

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> 
    <xsl:template match="/*"> 
    <xsl:copy> 
     <!-- copy the first job-whose-name-is-not-dummy --> 
     <xsl:copy-of select="job[not(@name = 'dummy')][1]" /> 
    </xsl:copy> 
    </xsl:template> 
</xsl:stylesheet> 

다른 방법이 그것에 대해 생각하는 것 :

당신은 당신이 유지하려는 할 job 요소와 바로 복사가 아닌 다른 작업을 수행하려는 경우
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> 

    <!-- copy everything as-is unless overridden --> 
    <xsl:template match="@*|node()"> 
    <xsl:copy><xsl:apply-templates select="@*|node()" /></xsl:copy> 
    </xsl:template> 

    <!-- ignore jobs named dummy --> 
    <xsl:template match="job[@name = 'dummy']" /> 

    <!-- ignore jobs *not* named dummy, apart from the first one --> 
    <xsl:template match="job[not(@name = 'dummy')][position() &gt; 1]" /> 

</xsl:stylesheet> 

그런 식으로 당신은 더 템플릿을 정의 할 수 있습니다.

+0

내 상황이 조금 다릅니다 사용할 수 있지만 덕분에, 나는 그것의 요점을 얻었다. 기본적으로 모든 노드를 복사하고 copy-all 템플릿 외부의 원하지 않는 노드를 제거했습니다. 그래서 저는 두 줄을 사용해야했습니다 : 그리고 Rnet

+0

아, 지금 편집을 보았습니다. 감사합니다. :) – Rnet

관련 문제