2009-11-06 3 views
2

나는 형식을 바꾸고 자하는 다음과 같은 형식의 XML을 가지고있다.XSLT/Xpath : 앞의 주석 선택

<blocks> 
    <!-- === apples === --> 
    <block name="block1"> 
     ... 
    </block> 
    <!-- === bananas === --> 
    <block name="block2"> 
     ... 
    </block> 
    <!-- === oranges === --> 
    <block name="block3"> 
     ... 
    </block> 
</blocks> 

내 문제는 각 블록 태그 위에있는 주석을 선택하는 방법을 알 수 없다는 것이다.

=== 사과 ===
block1
=== 바나나 ===
block2
=== 오렌지 ===
블록 3

하지만 얻을 수있는 가장 좋은 것은 다음과 같습니다.

=== 사과 ===
=== 바나나 ===
=== 오렌지 == =
block1
=== 사과 ===
=== 바나나 ===
=== 오렌지 ===
block2
=== 사과 ===
=== 바나나 = ==
=== 오렌지 ===
block3

차이가 있다면 PHP를 사용하고 있습니다.

답변

0

두 번째 템플릿 대신 주석에 대한 템플릿을 적용하여 순서대로 처리 할 수도 있습니다. 또한이 솔루션은 소스 XML의 데이터 순서에 따라 달라집니다.

<xsl:template match="//blocks"> 
     <xsl:apply-templates select="block | comment()" /> 
</xsl:template> 

PS : - 당신은이 최적이 될 수로 표현에서 "//"를 사용하지 않도록 할 수있다.

[편집] 전체 스타일 시트는 줄 바꿈을하려는 경우 블록 및 주석 모두에 값을 인쇄 한 후

<?xml version="1.0"?> 
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:template match="//blocks"> 
    <xsl:apply-templates select="block | comment()"/> 
</xsl:template> 
<xsl:template match="block"> 
    <xsl:value-of select="./@name"/> 
</xsl:template> 
<xsl:template match="comment()"> 
    <xsl:value-of select="."/> 
</xsl:template> 
</xsl:stylesheet> 

는 다음 문을 추가합니다.

<xsl:text>&#10;</xsl:text> 
+0

감사합니다. 저는 귀하의 버전이 더 간단하다고 생각합니다. 훌륭하게 작동합니다. –

3

스타일 시트가 약간 복잡합니다.

아래 스타일 시트를 시도해보고 원하는 출력과 일치하는지 확인하십시오!

<xsl:template match="//blocks"> 
     <xsl:apply-templates select="block" /> 
</xsl:template> 
<xsl:template match="block"> 
    <xsl:apply-templates select="preceding-sibling::comment()[1]" /> 
    <xsl:value-of select="./@name" /> 
</xsl:template> 
<xsl:template match="comment()"> 
    <xsl:value-of select="."></xsl:value-of> 
</xsl:template> 

이 코드는 현재 블록 태그 바로 앞에서 시작하는 1 또는 0 개의 설명과 항상 일치합니다.

+0

감사합니다. 복잡한 스타일 시트를 사용하는 이유는 다른 곳에서도 주석을 사용하고있는 실제 XML이기 때문입니다. –