2013-11-04 84 views
-1

我有兩個XML,其中一個包含條件,另一個xml包含必須根據條件評估分配給結果XML的錯誤代碼列表。在xslt 2.0中合併了兩個xml

Conditions.xml

​​

ErrorList.xml

<ErrorList> 
<error> 
    <errorcode>1</errorcode> 
    <errordescription>UPDATE INDICATOR.</errordescription> 
</error> 
<error> 
    <errorcode>2</errorcode> 
    <errordescription>SHOULD NOT BE BLANK.</errordescription> 
</error> 
<error> 
    <errorcode>3</errorcode> 
    <errordescription>NOT IN LIST</errordescription> 
</error> 
<error> 
    <errorcode>4</errorcode> 
    <errordescription>PARSE ERROR.</errordescription> 
</error> 

輸入XML:

<a> 
    <c> 
     <UPDATE-IND>A</UPDATE-IND> 
     <DUP-OVERRIDE>B</DUP-OVERRIDE> 
     <TYPE-RECORD>R</TYPE-RECORD> 
    </c> 
</a> 

在XSLT生成的XML應該像

當條件1爲真(從Conditions.xml)第一組的從ErrorList.xml錯誤代碼的應生成的XML被顯示。同樣,對於所有滿足的條件,錯誤節點應顯示在我的最終XML中。

如何爲此編寫XSLT?我一直在嘗試使用document()函數,但無法弄清楚如何遍歷所有條件和錯誤代碼,以形成最終的XML。

注意:我與撒克遜-B XSLT 2.0嘗試這在我的Tibco BW作爲轉換引擎。

新邏輯:

而是將兩個XML的的,我想利用這既包含條件和錯誤代碼的單個XML的。

輸入XML保持不變。

條件XML:

<ns0:root xmlns:ns0 = "http://www.tibco.com/schemas/Validation.xsd"> 
<ns0:subElement1 ID = "id"> 
    <ns0:subElement2 ID = "id"> 
     <ns0:subElement3 ID = "id"> 
      <ns0:subElement4 ID = "id"> 
       <ns0:subElement5 cond = "1"> 
        <ns0:conditions>1=1</ns0:conditions> 
        <ns0:errorcode>001</ns0:errorcode> 
       </ns0:subElement5> 
       <ns0:subElement5 cond = "2"> 
        <ns0:conditions>2=2</ns0:conditions> 
        <ns0:errorcode>002</ns0:errorcode> 
       </ns0:subElement5> 
       <ns0:subElement5 cond = "3"> 
        <ns0:conditions>3!=3</ns0:conditions> 
        <ns0:errorcode>003</ns0:errorcode> 
       </ns0:subElement5> 
      </ns0:subElement4> 
     </ns0:subElement3> 
    </ns0:subElement2> 
</ns0:subElement1> 

現在我想要得到的情況,對其進行評估並得到相同的XML相關的錯誤代碼。

注意: conditions.xml作爲輸入參數傳遞給XSLT。

+0

你有什麼到目前爲止已經試過?這是你想要的嗎?如果Condition-1的值('1 = 1')爲true,那麼顯示'errorcode'的errordescription等於1?那麼''後面的部分表示應該使用哪個錯誤代碼? –

+0

沒有' - '在這裏沒有意義。我將用撒克遜評估條件:evaluate()函數。如果第一個條件成立,則應顯示第一組錯誤節點,同樣應該評估XML中的所有條件。會有相同數量的條件和錯誤。 – Guru

回答

3

如果您想選擇僅僅基於位置,然後使用

<xsl:param name="error-url" select="'ErrorList.xml'"/> 

<xsl:variable name="errors" select="doc($error-url)/ErrorList/error"/> 

<xsl:template match="Validations"> 
    <xsl:apply-templates select="*"/> 
</xsl:template> 

<xsl:template match="Validations/*"> 
    <xsl:variable name="pos" select="position()"/> 
    <xsl:if test="saxon:evaluate(.)"> 
    <xsl:copy-of select="$errors[$pos]"/> 
    </xsl:if> 
</xsl:template> 

元素下面是一個更完整的樣本。假設我們的主要輸入作爲

<a> 
    <c> 
     <UPDATE-IND>A</UPDATE-IND> 
     <DUP-OVERRIDE>B</DUP-OVERRIDE> 
     <TYPE-RECORD>R</TYPE-RECORD> 
    </c> 
</a> 

test2013110502.xml作爲

<Validations> 
<Condition-1>UPDATE-IND!='A'</Condition-1> 
<Condition-2>DUP-OVERRIDE='B'</Condition-2> 
<Condition-3>TYPE-RECORD!='R'</Condition-3> 
</Validations> 

(注意改變你的樣品,右手邊有字符串文字)和

<ErrorList> 
<error> 
    <errorcode>1</errorcode> 
    <errordescription>UPDATE INDICATOR.</errordescription> 
</error> 
<error> 
    <errorcode>2</errorcode> 
    <errordescription>SHOULD NOT BE BLANK.</errordescription> 
</error> 
<error> 
    <errorcode>3</errorcode> 
    <errordescription>NOT IN LIST</errordescription> 
</error> 
<error> 
    <errorcode>4</errorcode> 
    <errordescription>PARSE ERROR.</errordescription> 
</error> 
</ErrorList> 
文件 test2013110503.xml

樣式單

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0" 
    xmlns:xs="http://www.w3.org/2001/XMLSchema" 
    xmlns:saxon="http://saxon.sf.net/" 
    exclude-result-prefixes="xs saxon"> 

<xsl:param name="conditions-url" as="xs:string" select="'test2013110502.xml'"/> 
<xsl:param name="conditions" as="document-node()" select="doc($conditions-url)"/> 

<xsl:param name="error-url" as="xs:string" select="'test2013110503.xml'"/> 
<xsl:param name="errors" as="document-node()" select="doc($error-url)"/> 

<xsl:strip-space elements="*"/> 
<xsl:output indent="yes"/> 

<xsl:template match="c"> 
    <errors> 
    <xsl:apply-templates select="$conditions/Validations/*"> 
     <xsl:with-param name="context" select="current()"/> 
    </xsl:apply-templates> 
    </errors> 
</xsl:template> 

<xsl:template match="Validations/*"> 
    <xsl:param name="context"/> 
    <xsl:variable name="pos" select="position()"/> 
    <xsl:apply-templates select="$context" mode="eval"> 
    <xsl:with-param name="expression" select="string(current())"/> 
    <xsl:with-param name="pos" select="$pos"/> 
    </xsl:apply-templates> 
</xsl:template> 

<xsl:template match="c" mode="eval"> 
    <xsl:param name="expression"/> 
    <xsl:param name="pos"/> 
    <xsl:if test="saxon:evaluate($expression)"> 
    <xsl:copy-of select="$errors/ErrorList/error[$pos]"/> 
    </xsl:if> 
</xsl:template> 

</xsl:stylesheet> 

輸出

<errors> 
    <error> 
     <errorcode>2</errorcode> 
     <errordescription>SHOULD NOT BE BLANK.</errordescription> 
    </error> 
</errors> 

同樣應該有可能使用XSLT 1.0處理器支持EXSLT dyn:evaluate功能:

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0" 
    xmlns:dyn="http://exslt.org/dynamic" 
    exclude-result-prefixes="dyn"> 

<xsl:param name="conditions-url" select="'test2013110502.xml'"/> 
<xsl:param name="conditions" select="document($conditions-url)"/> 

<xsl:param name="error-url" select="'test2013110503.xml'"/> 
<xsl:param name="errors" select="document($error-url)"/> 

<xsl:strip-space elements="*"/> 
<xsl:output indent="yes"/> 

<xsl:template match="c"> 
    <errors> 
    <xsl:apply-templates select="$conditions/Validations/*"> 
     <xsl:with-param name="context" select="current()"/> 
    </xsl:apply-templates> 
    </errors> 
</xsl:template> 

<xsl:template match="Validations/*"> 
    <xsl:param name="context"/> 
    <xsl:variable name="pos" select="position()"/> 
    <xsl:apply-templates select="$context" mode="eval"> 
    <xsl:with-param name="expression" select="string(current())"/> 
    <xsl:with-param name="pos" select="$pos"/> 
    </xsl:apply-templates> 
</xsl:template> 

<xsl:template match="c" mode="eval"> 
    <xsl:param name="expression"/> 
    <xsl:param name="pos"/> 
    <xsl:if test="dyn:evaluate($expression)"> 
    <xsl:copy-of select="$errors/ErrorList/error[$pos]"/> 
    </xsl:if> 
</xsl:template> 

</xsl:stylesheet> 

我得到的結果

<?xml version="1.0"?> 
<errors> 
    <error> 
    <errorcode>2</errorcode> 
    <errordescription>SHOULD NOT BE BLANK.</errordescription> 
    </error> 
</errors> 

xsltproc

Using libxml 20708, libxslt 10126 and libexslt 815 
xsltproc was compiled against libxml 20706, libxslt 10126 and libexslt 815 
libxslt 10126 was compiled against libxml 20706 
libexslt 815 was compiled against libxml 20706 

在Windows上。

+0

謝謝馬丁。實際上,Conditions.xml和ErrorList.xml都是外部源,將用於將轉換應用於單獨的輸入xml。條件基於Input xml中的字段。在那種情況下如何改變這種邏輯? – Guru

+0

@Guru,向我們展示如果有第三個主要輸入文檔,所有三個輸入樣本的結構。 –

+0

我已經更新了所有三個xml的查詢。 – Guru