2014-09-29 104 views
0

我有一個XML文件,該文件是在http://pastie.org/9604783爲什麼這些xsl:當測試總是被評估爲false?

我使用與撒克遜-HE下面的XSL,雖然它不會產生錯誤(所以它應該是正確的語法)沒有任何的xsl:when語句似乎應評估爲真,因爲所有輸出標籤都按xsl:otherwise聲明打包在<bodytext></bodytext>中。

這些xsl:when語句的預期效果是下列

一些變化IF a:t元件具有 一個<p.sld>祖先 並且具有<r>祖先具有其具有的屬性的緊接在前的同級元素:值對lvl='1' THEN輸出的該a:t的內容包在<bulleted></bulleted> 以其他方式輸出該a:t包裹的內容物在<bodytext></bodytext>

什麼標籤輸出應該被包裹在變化取決於是否祖先是<p.sld><p.notes>lvl屬性是否具有值爲1,2,或3

這裏是我的XSL

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:fo="http://www.w3.org/1999/XSL/Format" xmlns:a="http://schemas.openxmlformats.org/drawingml/2006/main" xmlns:r="http://schemas.openxmlformats.org/officeDocument/2006/relationships" xmlns:p="http://schemas.openxmlformats.org/presentationml/2006/main"> 
    <xsl:output method="xml"/> 

    <xsl:template match="/"> 
    <document> 
     <xsl:apply-templates select="//a:t"/> 
    </document> 
    </xsl:template> 

    <xsl:template match="//a:t"> 
    <xsl:choose> 
     <xsl:when test="(count(ancestor::p:sld) > 0) and (count(ancestor::r/preceding-sibling::node[1][@lvl='1'])) > 0"> 
     <bulleted> 
      <xsl:value-of select="."/> 
     </bulleted> 
     </xsl:when> 
     <xsl:when test="(count(ancestor::p:sld) > 0) and (count(ancestor::r/preceding-sibling::node[1][@lvl='2'])) > 0"> 
     <bulleted2> 
      <xsl:value-of select="."/> 
     </bulleted2> 
     </xsl:when> 
     <xsl:when test="(count(ancestor::p:notes) > 0) and (count(ancestor::r/preceding-sibling::node[1][@lvl='2'])) > 0"> 
     <bulleted> 
      <xsl:value-of select="."/> 
     </bulleted> 
     </xsl:when> 
     <xsl:when test="(count(ancestor::p:notes) > 0) and (count(ancestor::r/preceding-sibling::node[1][@lvl='3'])) > 0"> 
     <bulleted2> 
      <xsl:value-of select="."/> 
     </bulleted2> 
     </xsl:when> 
     <xsl:otherwise> 
     <bodytext> 
      <xsl:value-of select="."/> 
     </bodytext> 
     </xsl:otherwise> 
    </xsl:choose> 
    </xsl:template> 

</xsl:stylesheet> 

下面是所需的XML輸出:

<?xml version="1.0" encoding="UTF-8"?> 
<document xmlns:fo="http://www.w3.org/1999/XSL/Format" xmlns:a="http://schemas.openxmlformats.org/drawingml/2006/main" xmlns:r="http://schemas.openxmlformats.org/officeDocument/2006/relationships" xmlns:p="http://schemas.openxmlformats.org/presentationml/2006/main"> 
    <bodytext>header text</bodytext> 
    <bodytext>body text </bodytext> 
    <bodytext>body text </bodytext> 
    <bodytext>body text </bodytext> 
    <bulleted>bulleted text</bulleted> 
    <bulleted>bulleted text</bulleted> 
    <bulleted>bulleted text</bulleted> 
    <bulleted2>bulleted2 text</bulleted2> 
    <bulleted2>bulleted2 text</bulleted2> 
    <bulleted2>bulleted2 text</bulleted2> 
    <bulleted2>bulleted2 text</bulleted2> 
    <bulleted>bulleted text</bulleted> 
    <bulleted>bulleted text</bulleted> 
    <bulleted>bulleted text</bulleted> 
    <bulleted>bulleted text</bulleted> 
    <bodytext>body text</bodytext> 
    <bodytext>body text</bodytext> 
    <bodytext>footer text</bodytext> 
    <bodytext>10</bodytext> 
    <bodytext>10</bodytext> 
    <bodytext>notes header text</bodytext> 
    <bodytext>notes body text </bodytext> 
    <bodytext>notes body text </bodytext> 
    <bodytext>notes table header text</bodytext> 
    <bodytext>notes table header text</bodytext> 
    <bodytext>notes table body text</bodytext> 
    <bodytext>notes table body text</bodytext> 
    <bodytext>notes table body text</bodytext> 
    <bodytext>notes table body text</bodytext> 
    <bodytext>notes table body text</bodytext> 
    <bodytext>notes table body text</bodytext> 
</document> 
+3

請將您的示例最小化爲僅顯示問題的必要條件。 – 2014-09-29 17:29:20

+0

這將有所幫助。 – 2014-09-29 17:36:44

回答

3

沒有與您嘗試兩個主要的問題和解決這些應該引起預期的XSLT工作:

  • 你是缺少名稱空間前綴ancestor::r。它應該是ancestor::a:r
  • 您正在使用preceding-sibling::node而不是preceding-sibling::node()。前者只會選擇名爲「節點」的元素,其中沒有。
    • 但是,實際上應該使用preceding-sibling::*而不是這兩者之一,以免空白文本節點受阻。

所有這一切說,你的方法可以通過使用變量和擺脫不必要的count(...) > 0東西被清理了很多。以下應該會產生預期的輸出:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:fo="http://www.w3.org/1999/XSL/Format" xmlns:a="http://schemas.openxmlformats.org/drawingml/2006/main" xmlns:r="http://schemas.openxmlformats.org/officeDocument/2006/relationships" xmlns:p="http://schemas.openxmlformats.org/presentationml/2006/main"> 
    <xsl:output method="xml"/> 

    <xsl:template match="/"> 
    <document> 
     <xsl:apply-templates select="//a:t"/> 
    </document> 
    </xsl:template> 

    <xsl:template match="a:t"> 
    <xsl:variable name="sld" select="ancestor::p:sld" /> 
    <xsl:variable name="notes" select="ancestor::p:notes" /> 
    <xsl:variable name="levelBeforeR" 
        select="ancestor::a:r/preceding-sibling::*[1]/@lvl" /> 

    <xsl:variable name="wrapperName"> 
     <xsl:choose> 
     <xsl:when test="$sld and $levelBeforeR = '1' or 
         $notes and $levelBeforeR = '2'"> 
      <xsl:text>bulleted</xsl:text> 
     </xsl:when> 
     <xsl:when test="$sld and $levelBeforeR = '2' or 
         $notes and $levelBeforeR = '3'"> 
      <xsl:text>bulleted2</xsl:text> 
     </xsl:when> 
     <xsl:otherwise>bodytext</xsl:otherwise> 
     </xsl:choose> 
    </xsl:variable> 

    <xsl:element name="{$wrapperName}"> 
     <xsl:value-of select="." /> 
    </xsl:element> 
    </xsl:template> 

</xsl:stylesheet> 
+0

謝謝!作爲後續是否有一種簡單的方法來擴展它,以包裝每個p:sld的第一個「a:t」後代的內容,其標記爲「」,每個p的第一個「a:t」後裔:筆記'與標記''?這不是通常應用的另一個包裝標籤(不包括)。 – 2014-09-30 19:03:11

+0

決定發佈,作爲一個全新的問題。見[link](http://stackoverflow.com/questions/26130774/selecting-first-descendant-of-a-certain-name-for-each-instance-of-a-particular-a) – 2014-09-30 21:57:56

0

最起碼,ancestor::r看起來是錯誤的。至少OSX有一個perl實用程序,xpath,您可以測試select statemtents。我不得不更換::r::a:r因爲沒有r節點源XML:

~ zyoung$ xpath so.xml "//a:t[ancestor::p:sld and ancestor::r]" 
No nodes found 
~ zyoung$ xpath so.xml "//a:t[ancestor::p:sld and ancestor::a:r]" 
Found 18 nodes: 
-- NODE -- 
<a:t>header text</a:t>-- NODE -- 
<a:t>body text </a:t>-- NODE -- 
<a:t>body text </a:t>-- NODE -- 
<a:t>body text </a:t>-- NODE -- 
<a:t>bulleted text</a:t>-- NODE -- 
<a:t>bulleted text</a:t>-- NODE -- 
<a:t>bulleted text</a:t>-- NODE -- 
<a:t>bulleted2 text</a:t>-- NODE -- 
<a:t>bulleted2 text</a:t>-- NODE -- 
<a:t>bulleted2 text</a:t>-- NODE -- 
<a:t>bulleted2 text</a:t>-- NODE -- 
<a:t>bulleted text</a:t>-- NODE -- 
<a:t>bulleted text</a:t>-- NODE -- 
<a:t>bulleted text</a:t>-- NODE -- 
<a:t>bulleted text</a:t>-- NODE -- 
<a:t>body text</a:t>-- NODE -- 
<a:t>body text</a:t>-- NODE -- 
<a:t>footer text</a:t> 

沒有做任何更多的工作,我猜:

  1. preceding...ancestor::r/preceding-sibling::node[1][@lvl='1']實際上應該是謂詞a:r,而不是路徑a:r

  2. count()函數NS是不必要的,因爲我的XPath實例證明......最基本的XSL測試是「沒有一個節點存在」的一個(一些節點數量> 0),所以test="a"意味着test="count(a) > 0"沒有所有...

  3. 的parens,這也看起來搞砸了(例如,)) > 0",爲什麼> 0以外的最後paren?);只是count()做掉,直到你真正關心的元素的確切數目

相關問題