2013-10-07 2 views
0

나는 이와 같은 XML을 가지고있다. 그것은 외부에서 공급되며 변경할 수 없습니다 :오직 하나의 조상 노드 값을 얻는다.

<locations> 
    <country iso_code="CA"> 
    <name>Canada</name> 
    <state abbreviation="AB"> 
     <name>Alberta</name> 
     <city> 
     <name>Leduc</name> 
     <location id="1"/> 
     </city> 
    </state> 
    <state abbreviation="BC"> 
     <name>British Columbia</name> 
     <city> 
     <name>Abbotsford</name> 
     <location id="2"/> 
     <location id="3"/> 
     </city> 
    </state> 
    </country> 
    <country iso_code="US"> 
    <name>United States</name> 
    <state abbreviation="AZ"> 
     <name>Arizona</name> 
     <city> 
     <name >Wikiup</name> 
     <location id="1"/> 
     </city> 
    </state> 
    </country> 
</locations> 

내 XSL은 다음과 같습니다 : 나는 xsltproc을 실행하면

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:output method="text" encoding="iso-8859-1"/> 
<xsl:strip-space elements="*" /> 
    <xsl:template match="/"> 
    <xsl:for-each select="//location[@id]"> 
     <xsl:call-template name="location"/> 
    </xsl:for-each> 
    </xsl:template> 

    <xsl:template name="location"> 
    <xsl:value-of select="@id"/>, 
    <xsl:value-of select="ancestor::city[1]"/>, 
    <xsl:value-of select="ancestor::state[1]"/>, 
    <xsl:value-of select="ancestor::state[1]/@abbreviation"/>, 
    <xsl:value-of select="ancestor::country[1]"/>, 
    <xsl:value-of select="ancestor::country[1]/@iso_code"/>, 
    </xsl:template> 

</xsl:stylesheet> 

, 나는이 출력 (I 그것을 samller 수 있도록 여분의 줄을했다) 수 : 나는 조상 [1] :이 모든 ancesotors, 내가 찾고 아니라 단지 하나의 값을 끌어 할 때

1,Leduc,AlbertaLeduc,AB,CanadaAlbertaLeducBritish ColumbiaAbbotsford,CA, 
2,Abbotsford,British ColumbiaAbbotsford,BC,CanadaAlbertaLeducBritish ColumbiaAbbotsford,CA, 
3,Abbotsford,British ColumbiaAbbotsford,BC,CanadaAlbertaLeducBritish ColumbiaAbbotsford,CA, 
...etc... 

문제입니다.

1,Leduc,Alberta,AB,Canada,CA, 
2,Abbotsford,British Columbia,BC,Canada,CA, 
3,Abbotsford,British Columbia,BC,Canada,CA, 
...etc... 

내가 ../../ 사용하여 시도 : 여기

처럼 출력이 보일 것입니다 것입니다. 표기법과 같은 결과를 얻었다. 몇 가지 다른 표기법으로 연주했는데 작동하지 않거나 연결된 값으로 다시 끝납니다.

처리중인 노드에 대한 직접 부모 만 해당 값을 얻는 방법은 무엇입니까?

여기 올바른 용어를 사용하고 있습니다. 이것은 하나의 프로젝트에 XSL을 처음 사용하는 것입니다.

상점에있는 웹 녀석들에게도 어려움이 있습니다. 그들은 종종 XSL을 사용하지 않습니다.

답변

1

XML을 상자로 생각하면 <value-of>은 선택한 상자와 상자 안에 들어있는 상자를 모두 풀고 상자를 던져 버리고 상자에 있던 실제 내용을 남깁니다. 이들은 텍스트 노드입니다. 속성도 버려지고 상자에 붙어있는 일종의 레이블입니다. <value-of select="ancestor::state">의 경우

, 그것은 <state> 상자의 압축을 풀고, 내부 <name> 상자와 <city> 상자를 두 상자를 찾습니다. <strip-space elements="*">을 사용하고 있기 때문에 다른 방법으로 유지할 수있는 모든 "white-space"버블 랩을 버립니다. 그것은 unbox에 계속되고 <name> 상자에 "Alberta"가 있고 <city> 상자에 상자가 두 개 더 있습니다 : <name><location> 상자.

그리고 그렇게 게임은 계속 : 방금 박스 없음 <name> 상자 내부, 그것은 Leduc을 발견하고 바로 옆에 Alberta을 유지하지만 <location> 상자에 아무 것도 발견하지 않습니다. 이제 포장을 풀어 드릴 것이 없습니다. 그래서 우리는 골판지와 버블 랩 쓰레기가 남아 있고 실제 내용은 AlbertaLeduc입니다 (함께 붙은 것은 AlbertaLeduc).

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:output method="text" encoding="iso-8859-1"/> 
    <xsl:strip-space elements="*" /> 

    <xsl:template match="/"> 
    <xsl:apply-templates select="//location[@id]"/> 
    </xsl:template> 

    <xsl:template match="location"> 
    <xsl:value-of select="@id"/>, 
    <xsl:value-of select="ancestor::city[1]/name"/>, 
    <xsl:value-of select="ancestor::state[1]/name"/>, 
    <xsl:value-of select="ancestor::state[1]/@abbreviation"/>, 
    <xsl:value-of select="ancestor::country[1]/name"/>, 
    <xsl:value-of select="ancestor::country[1]/@iso_code"/>, 
    </xsl:template> 

</xsl:stylesheet> 
+0

감사로드 :

여기에 코드의 제안 개선! 귀하의 수정 사항과 동일한 코드를 수행 했었습니다 : 예 : 템플릿을 사용하여 작성했으나 그 당시의 코드를 게시하기 전에 저의 쓰레기 중 하나였습니다. 내가 말했듯이, 이것은 하나 떨어져 있으며 나는 xsl을 사용하지 않습니다. 누락 된 조각은 노드의 가치를 얻으려면/name입니다! – user2855855

+0

나는 그것이 당신을 위해 일해서 다행이다! 귀하의 질문에 대한 답변이 있으면 확인 표시를 클릭하여 동의 할 수 있습니까? –

관련 문제