簡體   English   中英

如何針對XML模式驗證XSLT模板的邏輯?

[英]How can I validate an XSLT template's logic against an XML schema?

XSLT轉換對要轉換的XML結構進行隱式假設。 例如,以下內容:

<xsl:variable name="b"><xsl:value-of select="A/B"/></xsl:variable>

假定XML節點“ B”位於“ A”的正下方,例如:

<A>
  <B>Hello</B>
<\A>

如果XML格式已更改,並且變為:

<A>
  <AA>
    <B>Hello</B>
  </AA>
<\A>

XSLT現在將無法找到節點B,並且將假定在這種情況下未指定該節點(這是一個有效的選項)。

我以為可以指定XSLT嘗試轉換的XML模式,並且如果XSLT曾經引用過該模式無法識別的節點,則將引發驗證錯誤。 但是,我似乎找不到這種實現( https://www.ibm.com/developerworks/library/x-schemaxslt/index.html似乎只提到了驗證輸入XML和生成的XML,而不是XSLT本身)。

[盡管一種方法可能是創建XSLT期望的XML模式,然后將輸入的XML與之比較,但我有100個不同版本的XSLT,因此這是不切實際的。 但是,創建輸入的XSD並詢問XSLT是否可以這樣做很簡單。

這就是XSLT 2.0 / 3.0中可識別模式的處理的目的。

在模板規則的匹配模式中,您必須聲明僅將使用它來處理架構有效的元素:

<xsl:template match="schema-element(invoice)">
 ...
</xsl:template>

或在XSLT 3.0中,您可以聲明某個模式下的所有模板規則都旨在處理架構有效的輸入:

<xsl:mode typed="strict"/>

然后如果您根據架構使用了不存在的路徑,例如

<xsl:template match="schema-element(invoice)">
 <xsl:apply-templates select="customer-detials"/>
</xsl:template>

XSLT處理器將告訴您有關情況。 您必須使用<xsl:import-schema>聲明告訴XSLT處理器在哪里可以找到模式。

模式意識是該語言的一個未被充分利用的功能。 要利用它,需要先付出一些努力,並且有時可能會因“假陽性”錯誤消息而有些麻煩,但是一旦掌握了這些錯誤,它就可以抓住很多簡單的方法用戶錯誤,否則將需要數小時來調試。 在某些情況下,模式感知還可以通過減少需要搜索的源文檔的數量以及避免重復的數據類型轉換來幫助提高性能,但是更好的靜態錯誤檢查是主要的好處。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM