2013-02-28 19 views
2

我正在尋找一種簡單的方法來使XSLT在嘗試訪問不存在的源XML中的屬性(或元素)時拋出錯誤。 目前我要做的就是第一次檢查,如果一個屬性存在,並且手動拋出一個錯誤,如果它不 - 如: 如果某個屬性或元素不存在,是否有辦法使XSLT引發錯誤?

<xsl:if test="not(attribute_to_use)"> 

<xsl:message terminate="yes"> 

    <xsl:text>error message</xsl:text>      

</xsl:message> 

</xsl:if> 

<!-- do something --> 

<xsl:attribute name="new_attribute"><xsl:value-of select="attribute_to_use" /></xsl:attribute> 

我發現了很多的代碼來檢查的屬性 - 尤其是如果你這樣做爲所有屬性。 是否有任何其他方式在XSLT中執行此操作 - 例如,通過設置像「在非現有屬性上中止」的指令?

我知道這樣做的一種方法是使用DTD或架構,如果沒有直接的XSLT方式,我會這樣做。

非常感謝!

回答

2

XSLT 1.0正如您所知,它基於模板來匹配節點,所以您可以編寫一個模板來匹配所有沒有特定屬性的元素。

例如,以下模板將匹配所有元素,例如沒有@id屬性。

<xsl:template match="*[not(@id)]"> 
    <xsl:message terminate="yes"> 
     <xsl:value-of select="concat('Attribute @id does not exist in element ', name())" /> 
    </xsl:message> 
</xsl:template> 

所以,如果你想強加某些元素,你可以在比賽中表現像使用特定屬性:元[未(@id)|元素2 [不是(@a)等,並然後寫每個元素來處理它們的情況下,不同的模板,他們有這些屬性:

<xsl:template match="Element[not(@id)]|Element2[not(@a)]"> 
    <!-- Throw error message --> 
</xsl:template> 

<xsl:template match="Element"> 
    <!-- Process Elements which have an @id attribute --> 
</xsl:template> 

<xsl:template match="Element2"> 
    <!-- Process Elements which have an @a attribute --> 
</xsl:template> 

,因爲你需要(這不應該是很複雜)的複雜你可以寫模板扔當某些元素有一個錯誤某些屬性,如「有屬性」,「屬性值無效」,「子女數量爲5」等。

希望能夠給你一個關於如何以一般方式實現你正試圖實現的想法。

2

在XPath 2.0中,無論何時想要使用節點$ N,如果它不存在,都會失敗,只需將函數調用中的引用包裝爲一個($ N)或一個或多個($ N)。

相關問題