2012-03-09 63 views
0

我是XSLT的新手,並且獲得了使用XML的新任務& XSLT。使用XSL進行復雜的XML處理

我有很多有孩子和他們的孩子的XML文件。

現在,當我使用xsl的porcess xml它對父節點,但子節點工作正常,我沒有得到任何數據。 XML文件:

<jrnl:bodytext> 
     <level> 
      <bodytext> 
       <pgrp> 
        <heading> 
         <title> 
          <emph typestyle="bf">1. Orange</emph> 
         </title> 
        </heading> 
        <p> 
         <text>Paragraph 1</text> 
        </p> 
        <p> 
         <text>Paragraph 2<text> 
        </p> 
        <p> 
         <text>Paragraph 3</text> 
        </p> 



       </pgrp> 
       <pgrp> 
        <heading> 
         <title> 
          <emph typestyle="bf">2. Apple </emph> 
         </title> 
        </heading> 
        <pgrp> 
         <heading> 
          <title>(a) Introduction</title> 
         </heading> 
         <p> 
          <text>Paragraph 1</text> 
         </p> 
        </pgrp> 
        <pgrp> 
         <heading> 
          <title>(b) The Facts</title> 
         </heading> 
         <p> 
          <text>Paragraph 2</text> 
         </p> 
         <p> 
          <text>Paragraph 3</text> 
         </p> 


        </pgrp> 
        <pgrp> 
         <heading> 
          <title>(c) Mango</title> 
         </heading> 
         <p> 
          <text>Paragraph 1</text> 
         </p> 
         <p> 
          <text>Paragraph 2</fnr> 
          </text> 
         </p> 
         <p> 
          <text>Paragraph 3</text> 
         </p> 

        </pgrp> 
        <pgrp> 
         <heading> 
          <title>(d) Misreading of Authority</title> 
         </heading> 
         <p> 
          <text>Paragraph 1</text> 
         </p> 
         <p> 
          <text>Paragraph 2</text> 
         </p> 
         <p> 
          <text>Paragraph 3</text> 
         </p> 

        </pgrp> 
        <pgrp> 
         <heading> 
          <title>(e) The case</title> 
         </heading> 
         <p> 
          <text>Paragraph 1</text> 
         </p> 
         <p> 
          <text>Paragraph 2 
          </text> 
         </p> 
         <p> 
          <text>Paragraph 3</text> 
         </p> 

        </pgrp> 
       </pgrp> 
       <pgrp> 
        <heading> 
         <title> 
          <emph typestyle="bf">3. Principles</emph> 
         </title> 
        </heading> 
        <p> 
         <text>Paragraph 1</text> 
        </p> 
        <p> 
         <text>Paragraph 2</text> 
        </p> 
        <p> 
         <text>Paragraph 3</text> 
        </p> 
        <p> 
         <text>Paragraph 4</text> 
        </p> 

       </pgrp> 
       <pgrp> 
        <heading> 
         <title> 
          <emph typestyle="bf">4. Guidelines </emph> 
         </title> 
        </heading> 
        <p> 
         <text>Paragraph 1</text> 
        </p> 
        <p> 
         <text>Paragraph 2</text> 
        </p> 
        <p> 
         <l> 
          <li> 
           <lilabel>(i)</lilabel> 
           <p> 
            <text>Paragraph 2.1</text> 
           </p> 
          </li> 

         </l> 
        </p> 
        <p> 
         <text>Pragraph 3</text> 
        </p> 
       </pgrp> 
       <pgrp> 
        <heading> 
         <title> 
          <emph typestyle="bf">5. Conclusion</emph> 
         </title> 
        </heading> 
        <p> 
         <text>Paragraph 1</text> 
        </p> 
       </pgrp> 
      </bodytext> 


     </level> 
    </jrnl:bodytext> 

現在我想要得到的所有,標題和文本數據。雖然我可以獲取所有外部數據,但我無法獲取他們的子女數據。

這裏是XSL代碼

<xsl:for-each select="//jrnl:bodytext/level/bodytext/pgrp"> 
     <xsl:text>$T$=</xsl:text> 
      <xsl:value-of select="heading/title/emph"/> 
      <xsl:text> 
</xsl:text> 
      <xsl:for-each select="p"> 
      <xsl:text>$T</xsl:text> 
      <xsl:value-of select="text"/> 
       <xsl:text> 
</xsl:text> 
      </xsl:for-each> 
      <xsl:text> 
</xsl:text> 
     </xsl:for-each> 

延長這個問題,現在我已經嘗試過相同的代碼建議,但沒有發生。

請看下面,我試過了。

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

<xsl:template match="//jrnl:bodytext"> 
    <xsl:for-each select="level/bodytext"> 
     <xsl:for-each select="pgrp"> 
      <xsl:text>$T$=</xsl:text> 
      <xsl:value-of select="heading/title/emph"/> 
      <xsl:text> 
</xsl:text> 
      <xsl:for-each select="p"> 
       <xsl:text>$T</xsl:text> 
       <xsl:value-of select="text"/> 
       <xsl:text> 
</xsl:text> </xsl:for-each> 
     </xsl:for-each> 
     <xsl:text> 
</xsl:text> 
    </xsl:for-each> 
</xsl:template> 
</xsl:stylesheet> 

,什麼輸出我得到的是

$T$=1. Orange 
    $TParagraph 1 
    $TParagraph 2 
    $TParagraph 3 
$T$=2. Apple 
$T$=3. Principles 
    $TParagraph 1 
    $TParagraph 2 
    $TParagraph 3 
    $TParagraph 4 
$T$=4. Guidelines 
    $TParagraph 1 
    $TParagraph 2 
    $T 
    $TPragraph 3 
$T$=5. Conclusion 
    $TParagraph 1 

我這種情況下,文本entris爲PGRP 2(蘋果)必須大於1倍,而在輸出我只拿到了1項即$ T $ = 2 。蘋果

+0

請添加輸入值和您嘗試過的代碼 – 2012-03-09 08:23:08

+0

我已經添加了我的代碼。 – Vish 2012-03-09 08:55:13

回答

0

考慮下面的輸入片段

<pgrp> 
    <heading> 
     <title> 
      <emph typestyle="bf">2. Apple </emph> 
     </title> 
    </heading> 
    <pgrp> 

在這裏,我們可以看到,有一個內。因此,選擇器

<xsl:for-each select="//jrnl:bodytext/level/bodytext/pgrp"> 

不起作用。要做到這一點,您需要在當前標記下的單獨for-tag中選擇pgrp

+0

儘管我可以做到這一點,但問題是,因爲XMl文件是動態生成的,所以每個父pgrp標記下可能會有許多pgrp標記,所以在這種情況下,我需要一些遞歸函數,它會自動調用每個pgrp標記並處理直到最後一個pgrp標籤。因此,我怎麼能達到它,因爲我已經在這段代碼中嘗試了很多其他遞歸函數,但沒有任何工作 – Vish 2012-03-09 09:35:34

+0

沒錯,所以選擇pgrp而不選擇父應該是 2012-03-09 10:32:53