2012-03-31 2 views
2
내 스타일 시트의 구조는

에 복합 패턴의 카운터를 얻기 위해 시도 :다음과 같은 XSL

<xsl:apply-templates select="pattern1|pattern2|pattern3"/> 
     ... 
    <xsl:template match="pattern1|pattern2|pattern3"> 
     <xsl:variable name="counter"> 
      <xsl:number/> 
     </xsl:variable> 
     ... 
    </xsl:template> 

카운터 변수가 각 패턴에 대해 재설정됩니다. 모든 경기에서 카운터을 받고 싶습니다. 어떻게 구현할 수 있습니까? 감사합니다. 다음과 같은

XML 소스 구조 :

<?xml version="1.0" encoding="UTF-8"?> 
<root> 
    <div class="entry"> 
     <div class="headword"> 
      ... 
     </div> 
     <div class="information-forms"> 
      test infomation block 
     </div> 
     <div class="definition"> 
      <div>text </div> 
      <div>text </div> 
        ... ... 
      <div>text </div> 
     </div> 
     <div class="example-sentences"> 
      <ol> 
       <li>sentence here</li> 
       <li>sentence here</li> 
      ... ... 
       <li>sentence here</li> 
      </ol> 
     </div> 
     <div class="synonyms-reference"> 
      <div class="syn-para"> 
       Synonyms: ... ... 
      </div> 
      <div class="ant-para"> 
       Antonyms: ... ... 
      </div> 
     <div class="..."> 
       ... 
     </div> 
     </div> 
    </div> 
    <div class="entry"> 
     ... 
    </div> 
    <div class="entry"> 
     ... 
    </div> 
    ... ... 
</root> 

나는 각 사업부의 [에 @ 클래스 = "항목"] 노드 아래에 여러 패턴의 노드의 카운터를 싶어.

따라서 새 div [@ class = "entry"] 노드에서 시작할 때 카운터를 재설정해야합니다. XPath는 패턴의 이

div[@class='information-forms'] 
| 
div[@class='definition'].div 
| 
div[@class='example-sentences']/ol/li 

이다 나는. XSL 스타일 시트를 두 번 구문 분석하여 작업을 수행하는 방법을 알아낼 수 (처음은 하나 개의 노드에 일치하는 모든 노드를했습니다.)하지만 그것은 할 수있는 나에게 보인다 한 번에 할 수 있습니다. XSL/XSLT 경험이 있으면 도움이되기를 바랍니다. 감사.

+0

, 완전한 예를주십시오 - XML ​​문서 (가능한 한 작게) 완전한는 정확한 결과를 원하고 규칙 변환이 구현되어야 함을 의미합니다. 변수에 어떤 값을 넣었습니까? 질문을 편집하고 명시 적으로 표시하십시오. 그렇지 않으면 사람들은 추측 할 필요가 있으며 응답의 정확성은 무작위입니다. –

답변

0

는 다음을 시도 할 수 있습니다. 설명 : 처리 할 노드 세트에 대한 특정 템플리트를 호출하고 매개 변수로 세트를 제공 한 다음 템플리트에서 position()을 사용하십시오. 사용자가 제공 한 XML 입력으로

<xsl:template match="div[@class='entry']"> 
    <div> 
     <xsl:variable name="divs" select=" 
     div[@class='information-forms'] 
     | 
     div[@class='definition']/div 
     | 
     div[@class='example-sentences']/ol/li 
     "/> 
     <xsl:call-template name="divs"> 
      <xsl:with-param name="divs" select="$divs"/> 
     </xsl:call-template> 
    </div> 
</xsl:template> 



<xsl:template name="divs"> 
    <xsl:param name="divs"/> 
    <xsl:for-each select="$divs"> 
     <pos><xsl:value-of select="position()"/></pos> 
    </xsl:for-each> 
</xsl:template> 

,이 결과로 제공

<?xml version="1.0" encoding="UTF-8"?> 
<out> 
    <div> 
     <pos>1</pos> 
     <pos>2</pos> 
     <pos>3</pos> 
     <pos>4</pos> 
     <pos>5</pos> 
     <pos>6</pos> 
     <pos>7</pos> 
    </div> 
    <div/> 
    <div/> 
</out> 
0

를 사용하여 아래의 변환처럼 xsl:number의 적절 countlevel 속성 :

<t> 
    <A> 
     <A.1> 
      <A.1.1/> 
      <A.1.2/> 
     </A.1> 
     <A.2> 
      <A.2.1/> 
     </A.2> 
     <A.3/> 
    </A> 
    <B> 
     <B.1/> 
     <B.2> 
      <B.2.1/> 
      <B.2.2> 
       <B.2.2.1/> 
       <B.2.2.2/> 
      </B.2.2> 
     </B.2> 
    </B> 
    <C> 
     <C.1/> 
     <C.2> 
      <C.2.1/> 
      <C.2.2> 
       <C.2.2.1/> 
       <C.2.2.2/> 
      </C.2.2> 
     </C.2> 
    </C> 
</t> 

을 :이 변환은 다음과 같은 XML 문서에 적용

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

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

<xsl:template match= 
    "*[starts-with(name(), 'A') and contains(name(), '.')] 
    | 
    *[starts-with(name(), 'B') and contains(name(), '.')] 
    | 
    *[starts-with(name(), 'C') and contains(name(), '.')] 
    "> 
    <X oldname="{name()}"> 
    <xsl:number level="any" count= 
    "*[starts-with(name(), 'A') and contains(name(), '.')] 
    | 
    *[starts-with(name(), 'B') and contains(name(), '.')] 
    | 
    *[starts-with(name(), 'C') and contains(name(), '.')] 
    "/> 
    <xsl:apply-templates/> 
    </X> 
    </xsl:template> 
</xsl:stylesheet> 

올바른 결과를 원했습니다 (모든 요소의 절대 번호 매기기). 이름이 "."을 포함)는을 생성됩니다

<t> 
    <A> 
     <X oldname="A.1">1 
      <X oldname="A.1.1">2</X> 
      <X oldname="A.1.2">3</X></X> 
     <X oldname="A.2">4 
      <X oldname="A.2.1">5</X></X> 
     <X oldname="A.3">6</X> 
    </A> 
    <B> 
     <X oldname="B.1">7</X> 
     <X oldname="B.2">8 
      <X oldname="B.2.1">9</X> 
      <X oldname="B.2.2">10 
       <X oldname="B.2.2.1">11</X> 
       <X oldname="B.2.2.2">12</X></X></X> 
    </B> 
    <C> 
     <X oldname="C.1">13</X> 
     <X oldname="C.2">14 
      <X oldname="C.2.1">15</X> 
      <X oldname="C.2.2">16 
       <X oldname="C.2.2.1">17</X> 
       <X oldname="C.2.2.2">18</X></X></X> 
    </C> 
</t> 

업데이트을 : 영업 이익은 가지고와 샘플 XML 문서를 제공하고, 번호는 각 div[@class='entry]에서 재설정해야 함을 명확히하고있다.

해결 :

이 변환 다음 다음 XML 문서에 적용될 때

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

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

<xsl:template match= 
    "div[@class='information-forms'] 
    | 
    div[@class='definition']/div 
    | 
    div[@class='example-sentences']/ol/li 
    "> 
    <xsl:number level="any" 
    count="div[@class='information-forms'] 
       | 
       div[@class='definition']/div 
       | 
       div[@class='example-sentences']/ol/li" 
    from="div[@class='entry']"/> 

    <xsl:call-template name="identity"/> 
</xsl:template> 
</xsl:stylesheet> 

는 :

<root> 
    <div class="entry"> 
     <div class="headword"> 
       ... 
     </div> 
     <div class="information-forms"> 
       test infomation block 
     </div> 
     <div class="definition"> 
      <div>text </div> 
      <div>text </div> 
         ... ... 
      <div>text </div></div> 
     <div class="example-sentences"> 
      <ol> 
       <li>sentence here</li> 
       <li>sentence here</li> 
       ... ... 
       <li>sentence here</li> 
      </ol> 
     </div> 
     <div class="synonyms-reference"> 
      <div class="syn-para"> 
        Synonyms: ... ... 
      </div> 
      <div class="ant-para"> 
        Antonyms: ... ... 
      </div> 
      <div class="..."> 
        ... 
      </div></div></div> 
    <div class="entry"> 
      ... 
    </div> 
    <div class="entry"> 
     <div class="headword"> 
       ... 
     </div> 
     <div class="information-forms"> 
       test infomation block 
     </div> 
     <div class="definition"> 
      <div>text </div> 
      <div>text </div> 
         ... ... 
      <div>text </div></div> 
     <div class="example-sentences"> 
      <ol> 
       <li>sentence here</li> 
       <li>sentence here</li> 
       ... ... 
       <li>sentence here</li> 
      </ol> 
     </div> 
     <div class="synonyms-reference"> 
      <div class="syn-para"> 
        Synonyms: ... ... 
      </div> 
      <div class="ant-para"> 
        Antonyms: ... ... 
      </div> 
      <div class="..."> 
        ... 
      </div></div></div> 
</root> 

가 원하는 결과 (원하는 요소를 생성 번호가 매겨져있다. D 번호)를 각 div[@class='entry] 리셋된다

<root> 
    <div class="entry"> 
     <div class="headword"> 
       ... 
     </div>1<div class="information-forms"> 
       test infomation block 
     </div> 
     <div class="definition">2<div>text </div>3<div>text </div> 
         ... ... 
      4<div>text </div> 
     </div> 
     <div class="example-sentences"> 
     <ol>5<li>sentence here</li>6<li>sentence here</li> 
       ... ... 
       7<li>sentence here</li> 
     </ol> 
     </div> 
     <div class="synonyms-reference"> 
     <div class="syn-para"> 
        Synonyms: ... ... 
      </div> 
     <div class="ant-para"> 
        Antonyms: ... ... 
      </div> 
     <div class="..."> 
        ... 
      </div> 
     </div> 
    </div> 
    <div class="entry"> 
      ... 
    </div> 
    <div class="entry"> 
     <div class="headword"> 
       ... 
     </div>1<div class="information-forms"> 
       test infomation block 
     </div> 
     <div class="definition">2<div>text </div>3<div>text </div> 
         ... ... 
      4<div>text </div> 
     </div> 
     <div class="example-sentences"> 
     <ol>5<li>sentence here</li>6<li>sentence here</li> 
       ... ... 
       7<li>sentence here</li> 
     </ol> 
     </div> 
     <div class="synonyms-reference"> 
     <div class="syn-para"> 
        Synonyms: ... ... 
      </div> 
     <div class="ant-para"> 
        Antonyms: ... ... 
      </div> 
     <div class="..."> 
        ... 
      </div> 
     </div> 
    </div> 
</root> 

설명 : xsl:numberfrom 속성의 적절한 사용.

+0

각'div [@ class = "entry"]'에 대해 카운터를 재설정해야합니다. 도움! – lex

+0

결과로 얻으려는 것이 아직 명확하지 않습니다. 다시 편집하고 최소한의 (그러나 완전한 예를) 제공하십시오. 나는 여러분의 문제가'xsl : number'의 또 다른 속성을 사용하여 해결 될 수 있다고 생각합니다. 코드의 어떤 지점에서 결과로 얻는 것이 정확히 무엇인지 정확하게 설명합니다. –

+0

내 질문에 대한 추가 정보를 편집했습니다. 이번에는 내가 뭘하려고하는지 설명하길 바래. – lex

0

에 한번 각 div[@class="entry"] 노드에서 다시 카운터를 시작하려면

count(preceding::pattern1|preceding::pattern2|preceding::pattern3) 

를 사용하여, 당신은

count(preceding::pattern1|preceding::pattern2|preceding::pattern3) - count(preceding::div[@class='entry'][1]/preceding::pattern1|preceding::div[@class='entry'][1]/preceding::pattern2|preceding::div[@class='entry'][1]/preceding::pattern3)‌​ 
+0

이것은 구문 적으로 유효하지 않습니다! –

+0

죄송합니다, 지금 해결. –