2014-08-27 42 views
-2

這裏是(相關部分)我的XML模板文件(以下稱爲'TEMPLATE.XML'):XSLT - 如何測試條件下的外部XML文檔中表示

<Template> 
    <ObjTmplId>74</ObjTmplId> 
    <AttTmplId>312</AttTmplId> 
    <Condition>Test=52</Condition> 
</Template> 

<Template> 
    <ObjTmplId>58</ObjTmplId> 
    <AttTmplId>100</AttTmplId> 
    <Condition>TestTwo=21 or TestTwo=26</Condition> 
</Template> 

<Template> 
    <ObjTmplId>8</ObjTmplId> 
    <AttTmplId>10</AttTmplId> 
    <Condition>TestThree!=1 or TestThree!=6</Condition> 
</Template> 

,這裏是我的XML輸入:

<p:objectAttributes> 
<p:attribute name="Test">10</p:attribute> 
<p:attribute name="TestTwo">0</p:attribute> 
<p:attribute name="TestThree">27</p:attribute> 
</p:objectAttributes> 

我現在的XSLT是這樣的:

<xsl:when test="document('template.xml') 
       /template/object/attribute/@name"> 
    <xsl:for-each select="document('template.xml')/condition"> 
    <xsl:element name="output:{@name}"> 
     <xsl:value-of select="text()" /> 
    </xsl:element> 
    </xsl:for-each> 
</xsl:when> 

如何使用XML轉換輸入文檔的模板小號以上是基於'template.xml'中相關模板中的<Condition>元素表示的條件嗎?

+1

這是沒有足夠的信息,你是「無法」。將您的XSLT代碼添加到問題中,我們很樂意指出您錯誤的位置。 – 2014-08-27 14:59:44

+0

我已經添加了xml輸入文件 – user3983344 2014-08-27 15:19:30

+0

XML文檔是_already_那裏。現在您添加了第二個,而不是顯示XSLT代碼。您展示的第一個示例是_not_ XSLT代碼,它是另一種形式的XML。 – 2014-08-27 15:23:43

回答

2

首先,一個健全的檢查,以確保我已經理解你的問題。

如果我正確理解您的問題,您希望您的XSLT評估不是以XPath表達式寫入XSLT本身,而是寫入外部「模板文件」的Condition元素中的條件,不太適合XPath。

例如(如果我理解正確的話),在給定的輸入條件Test=52應該評估爲false,鑑於輸入具有

<p:attribute name="Test">10</p:attribute> 

條件TestTwo=21 or TestTwo=26也應該評估爲false,由於輸入有

<p:attribute name="TestTwo">0</p:attribute> 

條件TestThree!=1 or TestThree!=6將評估爲真,因爲輸入具有

<p:attribute name="TestThree">27</p:attribute> 

請注意,對於TestThree假設的任何整數值,此條件始終計算爲true,因爲無論TestThree的假設值是多少,該值永遠都不會等於1和6,因此它總是會不等於一個或另一個。只有當我們假設一些允許值等於1和6的相等的定義時,條件纔有意義。XPath 2.0的=運算符提供了相等的定義;爲了以防萬一,如果我們假設= XPath的語義,然後在模板文件中的第三個條件的值爲true TestThree的價值。如果我理解你的問題同時包含1和6


序列正確的,那麼你的問題是,你想用你的條件表達式編寫一個解釋器使用XSLT。這可能是一個非常有趣的任務。但是,根據你給出的XSLT的片段來判斷,我猜你是XSLT的新手,即使是簡單的表達式語言,在XSLT中編寫解釋器也是你目前還沒準備好完成的任務。如果是我,我會重新考慮數據的XML表示和轉換的邏輯 - 你在數據中建立的間接級別將使所有事情變得比需要的複雜得多。

你的XSLT的一些注意事項,不直接關係到你問的問題,而是直接關係到你做這個或任何XSLT工作進展情況的能力:

  • xsl:when元素上的條件顯示

    document('template.xml') 
    /template/object/attribute/@name 
    

    這將永遠不會計算爲真,因爲它不能匹配任何東西template.xml告訴你(除非你省略不僅僅是封閉所有的模板元素的包裝元素更多):文檔法術的eleme nt Template,而不是template,而Template元素沒有名爲object的孩子。

    根據情況的一般邏輯,我期望對when元素與主輸入相關的測試,而不是template.xml文檔。所以我想對document()函數的前導調用是一個錯誤。但主要輸入也沒有任何可能匹配路徑表達式/template/object/attribute/@name。你有元素名稱的問題,你有命名空間的問題,直到你解決它們,你將無法完成任何工作。

  • 在xsl的選擇:對,每個讀

    document('template.xml')/condition 
    

    再次,這將匹配什麼:在模板文檔中,條件元素法術它的名字用大寫的C,而不是一個小寫C,和它不是文檔的根本元素。

  • 裏面的for-each,你有一個xsl:元素,並指定其名稱爲

    output:{@name} 
    

    從什麼時候起,這是評估必然有名字condition上下文節點,這是要去尋找一個condition元素上的name屬性 - 您沒有向我們展示任何名爲condition的元素,並且您顯示的名爲Condition的元素沒有name屬性。

我想你可能會受益於系統研究一本好的XSLT書籍。

祝你好運!

+1

+1一個非常慷慨的答案,因爲這個問題沒有解釋太多! – 2014-08-27 17:52:59

相關問題