2012-08-06 19 views
2

我一直在閱讀有關w3schools.com XPath軸和我一直在試圖尋找幫助,但我有一個很難搞清楚什麼實際搜索。Xpath的需要,以配合三種不同的方案

我有一個用於各種XML文件轉換成PDF打印一個XSL樣式表。我堅持的部分是,當我需要更改某些格式時,我已經確定了至少3種不同的場景。我已經找到一種方法來更改格式有兩種的情況,但第三個是一種另外兩個雜種,我不斷收到兩套格式來顯示時,我只想要一個。

請讓我知道如果任何附加信息是有用的,謝謝!

方案1:

<TASK> 
    <REVST>Some revised text 
</TASK> 

方案2:

<LIST> 
    <PARA> 
    <REVST />Some Text <REVEND /> 
    </PARA> 
</LIST> 

方案3:

<TASK> 
    <PARA> 
     <REVST />Some other revised text <REVEND /> 
    </PARA> 
</TASK> 

什麼似乎與方案1的工作中的一部分具有這種<xsl:if test="parent::*TASK/REVST">樣式表做一個for-each並遍歷每個「ITEM」。 什麼似乎與方案2的工作是有這個測試<xsl:if test="descendant::REVST">的PARA模板中。

但對於方案3,我結束了兩個顯示,當它應該只從PARA模板的格式。

有什麼建議嗎?甚至是搜索條件的建議?任何幫助將不勝感激:)

我知道我有一個很好的學習,我欣賞已提供的幫助,但我仍然不太明白如何得到這個不顯示修訂格式(當只有一些文本被指示修改時,整個文檔的頁面右側有一個欄)?

<LIST> 
<PARA> 
    <REVST/> 
    THIS IS SOME TEXT THAT SHOULD BE MARKED BY A REVISION BAR. 
    <REVEND/> 
</PARA> 
</LIST> 

而像這樣的情況下,我需要顯示實質上整個文檔的修訂版吧。

<TASK> 
    <ELE1/> 
    <REVST/> 
    <ELE2/> 
    <TITLE>The Title</TITLE> 
    <ELE3> 
     <ELE4> 
     <TITLE>General</TITLE> 
     <LIST> 
      <LITEM> 
      <PARA>This is some paragraph text.</PARA> 
      </LITEM> 
     </LIST> 
     </ELE4> 
    </ELE3> 
</TASK> 

我嘗試過所提供的內容,但似乎並不適用,除非我通過文本或PARA部分添加*。我可能在那裏錯過了一些東西。

<xsl:template match="TASK/*text()[preceding-sibling::*[1][self::REVST] and following-sibling::*[1][self::REVEND]]"> 
    <fo:block color="red" border-right="solid black 2pt" margin-right="16pt"> 
     <xsl:apply-templates /> 
    </fo:block> 
</xsl:template> 
<xsl:template match="LIST1/*PARA/text()[preceding-sibling::*[1][self::REVST] and following-sibling::*[1][self::REVEND]]"> 
    <fo:block color="green" border-right="solid black 2pt" margin-right="16pt"> 
     <xsl:apply-templates /> 
    </fo:block> 
</xsl:template> 

還有其他的建議嗎?我仍然停留:(

回答

1

這裏是如何做到這一點

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:output method="text"/> 
<xsl:strip-space elements="*"/> 

<xsl:template match= 
"TASK/text()[preceding-sibling::*[1][self::REVST] 
      and 
       following-sibling::*[1][self::REVEND] 
       ]"> 

    Processing Type1 of: "<xsl:value-of select="."/>" 
</xsl:template> 

<xsl:template match= 
"LIST/PARA/text()[preceding-sibling::*[1][self::REVST] 
       and 
        following-sibling::*[1][self::REVEND] 
        ]"> 

    Processing Type2 of: "<xsl:value-of select="."/>" 
</xsl:template> 

<xsl:template match= 
"TASK/PARA/text()[preceding-sibling::*[1][self::REVST] 
       and 
        following-sibling::*[1][self::REVEND] 
        ]"> 

    Processing Type3 of: "<xsl:value-of select="."/>" 
</xsl:template> 
</xsl:stylesheet> 

當應用這種轉變關於以下XML文檔:

<t> 
<TASK> <REVST/>Some revised text<REVEND/> </TASK> 
<LIST> <PARA> <REVST />Some other revisedext <REVEND /> </PARA> </LIST> 
<TASK> <PARA> <REVST />Some yet other revised text <REVEND /> </PARA> </TASK> 
</t> 

想要的結果(每種情況下,以自己的方式處理)生產:

Processing Type1 of: "Some revised text" 


    Processing Type2 of: "Some other revisedext " 


    Processing Type3 of: "Some yet other revised text " 

規則要記住

使用XSLT作爲XSLT ...。

這意味着:總是更喜歡模板內聯xsl:for-each。前者導致簡短,簡單,不易出錯,乾淨,易於理解和維護代碼。後者導致更長,更復雜,醜陋,意大利式麪條的代碼易於出錯,難以理解,難以擴展和維護。

+0

感謝您對喜歡模板的內嵌xsl:for-each的建議。我一直在學習中,儘可能多地清理一些東西。使用xsl:for-each的設置已經存在,所以我認爲它應該是這樣的。我有很長的路要走:) – froglander 2012-08-07 12:32:03

0

你爲什麼不使用完整路徑每次:

/TASK/REVST 
/LIST/PARA 
/TASK/PARA/REVST 
2

我一直在閱讀有關XPath軸上w3schools.com

這不是一個很好的學習策略。 w3schools非常方便查找你曾經知道但已經忘記的東西,但它不是爲了幫助你理解基本概念而組織的。給自己一本好書。

你的帖子告訴我,你還沒有理解上下文的重要概念。 XPath表達式的含義關鍵取決於上下文節點在評估點的位置。如果你理解了上下文,我假設你會告訴我們使用這些表達式的背景是什麼。

+0

你能推薦任何好書嗎?我發現很難選擇一本書而不能先看它,而書店裏似乎並沒有太多實際的東西。 – froglander 2012-08-07 12:28:13

+0

@froglander,凱博士是XSLT和XPath最好的書籍的作者。看到一個良好的XSLT/XPath書籍和其他資源的鏈接集合在這裏:http://stackoverflow.com/questions/339930/any-good-xslt-tutorial-book-blog-site-online/341589#341589 – 2012-08-07 12:41:16

+0

好吧,謝謝!現在把它縮小到一開始...... – froglander 2012-08-07 12:50:39