2016-04-21 74 views
0

我有喜歡的XML如下XSLT - 校驗節點存在或者不使用功能

<doc> 
    <meta-data> 
     <paper-name>ABC</paper-name> 
     <paper-type>fi</paper-type> 
    </meta-data> 

    <section> 
     <figure>fig1</figure> 
     <figure>fig2</figure> 
    </section> 
</doc> 

我的要求是,如果<paper-type>節點是<meta-data>變化<figure>節點<image>節點可用。

因此,輸出應該是什麼樣子,

<doc> 
    <meta-data> 
     <paper-name>ABC</paper-name> 
     <paper-type>fi</paper-type> 
    </meta-data> 

    <section> 
     <image>fig1</image> 
     <image>fig2</image> 
    </section> 
</doc> 

我已經寫了下面的xsl做這個任務,

<xsl:template match="node()|@*"> 
     <xsl:copy> 
      <xsl:apply-templates select="node()|@*"/> 
     </xsl:copy> 
    </xsl:template> 

    <xsl:function name="abc:check-paper-type" as="xs:boolean"> 
     <xsl:sequence select="root()//meta-data/paper-type"/> 
    </xsl:function> 

    <xsl:template match="figure[abc:check-paper-type()]"> 
     <image> 
      <xsl:apply-templates/> 
     </image> 
    </xsl:template> 

檢查<paper-type>節點可用內<meta-data>我寫了一個函數這裏命名「籤紙類型」。但不能按預期工作。

任何建議如何組織我的功能檢查,<paper-type>是否可用?

請注意,我需要通過檢查<paper-type>節點是否存在來更改大量節點。所以,使用函數檢查<paper-type>是否存在非常重要。

回答

1

之所以你的企圖不能工作是這樣的:

在樣式表功能的機構,重點是最初 不確定的;這意味着任何引用上下文項目,上下文位置或上下文大小的嘗試都是不可恢復的動態錯誤。 [XPDY0002]

http://www.w3.org/TR/xslt20/#stylesheet-functions

你可以做簡單:

<!-- identity transform --> 
<xsl:template match="@*|node()"> 
    <xsl:copy> 
     <xsl:apply-templates select="@*|node()"/> 
    </xsl:copy> 
</xsl:template> 

<xsl:template match="figure[../../meta-data/paper-type]"> 
    <image> 
     <xsl:apply-templates select="@*|node()"/> 
    </image> 
</xsl:template> 

鑑於你的投入,這將產生:

<?xml version="1.0" encoding="UTF-8"?> 
<doc> 
    <meta-data> 
     <paper-name>ABC</paper-name> 
     <paper-type>fi</paper-type> 
    </meta-data> 
    <section> 
     <image>fig1</image> 
     <image>fig2</image> 
    </section> 
</doc> 

另外,如果您需要指存在節點的ENCE反覆,你可以將其定義爲變量,而不是功能

<xsl:variable name="check-paper-type" select="exists(/doc/meta-data/paper-type)" /> 

<!-- identity transform --> 
<xsl:template match="@*|node()"> 
    <xsl:copy> 
     <xsl:apply-templates select="@*|node()"/> 
    </xsl:copy> 
</xsl:template> 

<xsl:template match="figure[$check-paper-type]"> 
    <image> 
     <xsl:apply-templates select="@*|node()"/> 
    </image> 
</xsl:template> 
+0

這是一個示例代碼,我需要通過檢查節點改變很多節點名稱是存在或不。因此,如果我可以使用函數來檢查是否可用,它將會更加有效。我對原始問題缺乏細節表示歉意。 – sanjay

+0

看看編輯答案是否有幫助。 –