2011-01-04 2 views
0

내 XML은 들어 'input.xsl'내 xslt가 올바른 출력을 생성하지 않습니까?

 <?xml version="1.0" encoding="ISO-8859-1"?> 
    <?xml-stylesheet type="text/xsl" href="input.xsl"?> 
     <catalog> 
    <cd> 
    <title>Empire Burlesque</title> 
    <artist>Bob Dylan</artist> 
    <country>USA</country> 
    <company>Columbia</company> 
    <price>10.90</price> 
    <year>1985</year> 
    </cd> 
    <cd> 
    <title>Hide your heart</title> 
    <artist>Bonnie Tyler</artist> 
    <country>UK</country> 
    <company>CBS Records</company> 
    <price>9.90</price> 
    <year>1988</year> 
    </cd> 
     </catalog> 

가 지금은 다음과 같이 XSLT의 도움으로 위의 XML 파일을 사용하여 다른 XML 문서를 생성하려면, (출력 형식)

 <?xml version="1.0" encoding="ISO-8859-1"?> 
     <catalog> 
     <cd> 
     <title>Empire Burlesque</title> 
     <artist>Bob Dylan</artist> 
     </cd> 
     <cd> 
     <title>Hide your heart</title> 
     <artist>Bonnie Tyler</artist> 
     </cd> 
      </catalog> 

입니다 나는 XML 형식으로 출력을 생성하지 않습니다 'input.xsl'

<?xml version="1.0" encoding="ISO-8859-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"/> 

    <xsl:template match="/"> 
     <xsl:element name="catalog"> 
      <xsl:apply-templates select="catalog/cd/title"/> <br/> 
      <xsl:apply-templates select="catalog/cd/artist"/> 
     </xsl:element> 
    </xsl:template> 

    <xsl:template match="catalog/cd/artist"> 
     <xsl:element name="cd"> 
      <xsl:value-of select="current()"/> 
     </xsl:element> 
    </xsl:template> 

    <xsl:template match="catalog/cd/title"> 
     <xsl:element name="cd"> 
      <xsl:value-of select="current()"/> 
     </xsl:element> 
    </xsl:template> 
    </xsl:stylesheet> 

위의 XSL 파일을 XSL 파일을 만듭니다. 그래서 내 코드의 문제는 무엇인가. 나를 안내 해줘. 미리 감사드립니다.

답변

1

일치하는 경로를 호출의 select 절에서 사용하고 있습니다. 각 노드가 일치하면 현재 노드가되며 그 이후에 상대적인 XPath 표현식이 평가됩니다. 또한 항상 요소를 구성 할 필요가 없습니다. 원하는 부분에 '보일러 플레이트'XML을 넣으십시오. 텍스트() 옳은 일 경우

<xsl:template match="/"> 
    <catalog><xsl:apply-templates /></catalog> 
</xsl:template> 

<xsl:template match="cd"> 
    <cd><xsl:apply-templates /></cd> 
</xsl:template> 

<xsl:template match="artist"> 
    <artist><xsl:value-of select="text()" /></artist> 
</xsl:template> 

<xsl:template match="title"> 
    <title><xsl:value-of select="text()" /></title> 
</xsl:template> 

내가 기억할 수없는,하지만 당신이 올바른 방향으로 가고 얻을 수 있습니다 :

내가 대신 좋습니다.

+0

한 예 나는 이것이 도움이되는 방식으로 현재 노드의 개념을 설명 생각 – PandaWood

+0

텍스트 내장 규칙은 문자열 출력 노드 값. 따라서 모든 규칙은 동일한 규칙입니다. '. 그러나 요소에 대한 내장 규칙 (이 경우'title' 또는'artist' 이외의'cd' chlidren)은 자식에게 템플릿을 적용하기 때문에 스트립 팅 규칙을 추가해야합니다. –

1

사실 나는 모든 템플릿 일치가 필요하다고 생각하지 않았습니다. 문맥이 매번 달라지기 때문에 더 어려워 보인다.

나는 단지 루트에서 일치 할 것이고, cd 요소에 대해 for-each를 할 것이다. 너무 간단한 것 같은데, 나는 당신이 신원이 패턴을 변형 악용,

<?xml version="1.0" encoding="ISO-8859-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"/> 

    <xsl:template match="/"> 
     <catalog> 
      <xsl:for-each select="catalog/cd"> 
       <cd> 
        <title><xsl:value-of select="title"/></title> 
        <artist><xsl:value-of select="artist"/></artist> 
       </cd> 
      </xsl:for-each> 
     </catalog> 
    </xsl:template> 
</xsl:stylesheet> 
+0

그리고 우리가이 길로 가면, 가장 좋은 대답은'' –

1

또 다른 방법을 ;-) 그냥 읽고 이해하는 것 같아요. 샘플 XML에 적용

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

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

<xsl:template match="country | company | price | year | processing-instruction()"/> 

</xsl:stylesheet> 

, 올바른 결과가 생성됩니다

<?xml version="1.0" encoding="UTF-8"?> 
<catalog> 
    <cd> 
     <title>Empire Burlesque</title> 
     <artist>Bob Dylan</artist> 
    </cd> 
    <cd> 
     <title>Hide your heart</title> 
     <artist>Bonnie Tyler</artist> 
    </cd> 
</catalog> 
+0

+1입니다. –

+0

하지만 PI는 제거 할 필요가 없습니다. 존재하지 않습니다. 그렇게한다면 아마도 주석 노드도 제거해야 할 것입니다. –

+0

@Dimitre, xml-stylesheet type = "text/xsl"href = "input.xsl"이 있습니다. – Flack

관련 문제