2011-04-07 5 views
2

XSLT를 사용하여 입력 XML에서 출력 XML로 일부 XML 태그 만 선택하려면 어떻게해야합니까? 예를 입력 :XSLT를 사용하여 XML 출력을 줄입니다.

<Country value="USA"> 
    <State value="KY> 
     <City value="Hebron" /> 
     <City value="Lexington" /> 
     <City value="Owensboro" /> 
     <City value="Jonesville" /> 
    </State> 
    <State value="OH"> 
     <City value="Cincinnati" /> 
     <City value="Columbus" /> 
     <City value="Cleveland" /> 
     <City value="Jonesville" /> 
    </State> 
    <State value="IN" > 
     <City value="Indianapolis" /> 
    </State> 
</Country> 

그래서, 대신 국가/주 태그를 유지하고 만 헤브론 신시내티 복사?

예상 출력 :

<Country value="USA"> 
    <State value="KY> 
     <City value="Hebron" /> 
    </State> 
    <State value="OH"> 
     <City value="Cincinnati" /> 
    </State> 
</Country> 
+1

보존하려는 태그는 무엇입니까? 각 주에서 처음? –

+0

''태그를 가지고 있기 때문에 ''(지방, 현 등)이 적합하지 않은 다른 국가가 있음을 의미합니다. 문제를 완전히 지정해야합니다. –

+0

하나 이상의 국가가있을 수 있지만이 예제에서는 (실제 태그가 아님) 다른 국가의 주에서는 주정부가 충분합니다. –

답변

2

다음 스타일 시트 :

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:template match="@*|node()"> 
     <xsl:copy> 
      <xsl:apply-templates select="@*|node()" /> 
     </xsl:copy> 
    </xsl:template> 
    <xsl:template match="City[not(@value='Hebron' or @value='Cincinnati')]" /> 
</xsl:stylesheet> 
을이 입력에 516,

:

<Country value="USA"> 
    <State value="KY"> 
     <City value="Hebron" /> 
    </State> 
    <State value="OH"> 
     <City value="Cincinnati" /> 
    </State> 
</Country> 

이 스타일은 변경되지 않은 출력에 불필요한 노드를 제외한 모든 복사 identity transform를 사용

<Country value="USA"> 
    <State value="KY"> 
     <City value="Hebron" /> 
     <City value="Lexington" /> 
     <City value="Owensboro" /> 
    </State> 
    <State value="OH"> 
     <City value="Cincinnati" /> 
     <City value="Columbus" /> 
     <City value="Cleveland" /> 
    </State> 
</Country> 

는 다음의 결과를 생성.

또 다른 예 또한 원하는 도시를하지 않는 State 요소를 제거 할 수 있습니다

. 이 스타일이 입력에 적용

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:template match="@*|node()"> 
     <xsl:copy> 
      <xsl:apply-templates select="@*|node()"/> 
     </xsl:copy> 
    </xsl:template> 
    <xsl:template match="City[not(@value='Hebron' or @value='Cincinnati')]"/> 
    <xsl:template 
      match="State[not(City[@value='Hebron' or @value='Cincinnati'])]"/> 
</xsl:stylesheet> 

:

<Country value="USA"> 
    <State value="KY"> 
     <City value="Hebron" /> 
     <City value="Lexington" /> 
     <City value="Owensboro" /> 
    </State> 
    <State value="OH"> 
     <City value="Cincinnati" /> 
     <City value="Columbus" /> 
     <City value="Cleveland" /> 
    </State> 
    <State value="MO"> 
     <City value="St. Louis" /> 
    </State> 
</Country> 

가 생산 :

<Country value="USA"> 
    <State value="KY"> 
     <City value="Hebron" /> 
    </State> 
    <State value="OH"> 
     <City value="Cincinnati" /> 
    </State> 
</Country> 
1

이 떠나 특정 도시 :

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


<xsl:template match="City[@value != 'Hebron' and @value != 'Cincinnati']"/> 

이는 첫번째 도시 떠날 것이다 :

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


<xsl:template match="City[position() &gt; 1]"/> 
1

은 여기 내 (아마 부적절한) 2.0 솔루션입니다. 도시는 매개 변수로 전달되는 정규 표현식입니다.

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

    <xsl:param name="Cities" select="'Cincinnati|Hebron'"/> 

    <xsl:template match="State"> 
    <xsl:if test="exists(City[matches(@value, $Cities)])"> 
     <xsl:copy> 
     <xsl:apply-templates select="@*|node()"/> 
     </xsl:copy> 
    </xsl:if> 
    </xsl:template> 

    <xsl:template match="State/City"> 
    <xsl:if test="matches(@value, $Cities)"> 
     <xsl:copy> 
     <xsl:apply-templates select="@*|node()"/> 
     </xsl:copy> 
    </xsl:if> 
    </xsl:template> 

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

</xsl:stylesheet> 
+0

@stand : 매개 변수 따라서 정규식이 필요하지 않습니다. –

+0

@Alejandro : 예, 정규 표현식을 사용하면 유연성이 향상 될 수 있다고 생각했기 때문에 "C로 시작하는 도시"를 선택하거나 그런 식으로 할 수 있습니다. 물론 당연히되어야합니다. 완전히 다른 문제 인 regexes에 익숙하다. – stand

+0

@stand : 그러나 더 중요한 점은 빈 시퀀스와 일치하는 금지 된 RegExp를 포함 할 수있는 매개 변수를 허용하는 스타일 시트 오류 창을 열지 않아야한다는 것입니다. –

관련 문제