2013-03-28 2 views
1

의 첫 번째 항목은 내가 제목 요소의 첫 번째 발생을 일치하고 여기에 텍스트를 추가 할일치 자식 노드

<body> 
     <heading>Main Heading</heading> 
     <para> 
     <text>para 1</text> 
     </para> 
     <para> 
     <heading>heading 2</heading> 
     <text> para 2</text> 
     </para> 
     <para> 
     <heading>heading 3</heading> 
     <text>para 3</text> 
     </para> 
    </body> 

XML 문서를 가지고있다. 난 단지 머리글의 첫 번째 항목을 원하고 머리글은 para 요소의 자식 노드 여야합니다.

그래서 출력 시작하는 방법에 상관 힌트 이해된다

<body> 
     <heading>Main Heading</heading> 
     <para> 
     <text>para 1</text> 
     </para> 
    <para> 
     <heading>**This is a first heading found** heading 2</heading> 
     <text> para 2</text> 
     </para> 
    <para> 
    <heading>heading 3</heading> 
     <text>para 3</text> 
     </para> 
    </body> 

아래와 같이 될 것이다.

+0

Technicall y ''요소의 첫 번째 항목은 Main Heading의 요소입니다. 따라서 귀하의 요구 사항은 ''의 하위 항목 인 첫 번째 제목 요소입니까? –

답변

4

이 당신이 원하는 것을 수행해야합니다

para[heading][1]/heading[1] 

그것은 최초의 내부의 첫번째 제목 요소 일치합니다 파라 - 그 - 포함 - 어떤-제목.

예 XSLT : 귀하의 예제에

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> 
    <xsl:template match="@*|node()"> 
    <xsl:copy><xsl:apply-templates select="@*|node()" /></xsl:copy> 
    </xsl:template> 

    <xsl:template match="para[heading][1]/heading[1]"> 
    <xsl:copy>**First heading** <xsl:apply-templates select="@*|node()" /></xsl:copy> 
    </xsl:template> 
</xsl:stylesheet> 

출력 :

<body> 
     <heading>Main Heading</heading> 
     <para> 
     <text>para 1</text> 
     </para> 
     <para> 
     <heading>**First heading** heading 2</heading> 
     <text> para 2</text> 
     </para> 
     <para> 
     <heading>heading 3</heading> 
     <text>para 3</text> 
     </para> 
    </body> 

바로 <body> 바로 아래에 중첩보다 XML에 <para> 요소를 다른 곳에가있을 수 있습니다 경우에 당신은에 더 안전 할 것 보다 구체적인 일치 표현식, 즉

/body/para[heading][1]/heading[1] 
+0

좋은 해결책 이안 +1 – Peter

0

첫 번째 <heading><para>의 자식이므로 position()para이어야합니다. 그리고 para는 <heading>이라는 자식이 있기 전에 한 번 발생하므로 두 번째가 필요합니다. <para>. 소스 XML에

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
version="1.0"> 

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

<xsl:template match="//para[position()=2]/heading"> 
    <xsl:element name="heading"> 
     <xsl:value-of select="concat('**This is a first heading found**',' ',.)"/> 
    </xsl:element> 
</xsl:template> 


</xsl:stylesheet> 

당신은이 출력 얻을 것이다 :

이 XSLT를 적용

<?xml version="1.0" encoding="UTF-8"?> 
<body> 
<heading>Main Heading</heading> 
<para> 
    <text>para 1</text> 
</para> 
<para> 
    <heading>**This is a first heading found** heading 2</heading> 
    <text> para 2</text> 
</para> 
<para> 
    <heading>heading 3</heading> 
    <text>para 3</text> 
</para> 
</body> 

안부, 피터

가 PS : 난 그냥 눈치는 XSLT를 원하는을 2.0 - 내 솔루션은 XSLT 1.0입니다. 차이가 있는지 확실하지 않습니다.

+0

감사합니다 피터,하지만 우리는 포지션 = 2라고 말하는 대신에 일반적인 솔루션을 사용할 수 없습니다. 왜냐하면이 작업이 2 가지 대신 3 번으로 진행될 수 있기 때문입니다. 그러나이 작업은 더 일반적인 솔루션을 찾고 있습니다. – atif

+0

이안이 트릭을했다고 생각합니다 ... – Peter