有沒有一種很好的方法來斷言當前元素的值必須是某種類型(例如xs:integer),並且如果不是,會拋出異常?使用XSL 2.0如何斷言元素值是某種類型的?
1
A
回答
0
1
可以使用FXSL函數庫的f:type()
函數來動態確定變量/值的類型。
以下是在FXSL爲f:type()
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:f="http://fxsl.sf.net/"
exclude-result-prefixes="f xs"
>
<xsl:import href="../f/func-type.xsl"/>
<!-- To be applied on ../data/numList.xml -->
<xsl:output omit-xml-declaration="yes"/>
<xsl:template match="/">
f:apply(f:typeConstructor(11),'03'): <xsl:value-of select="f:apply(f:typeConstructor(11),'03')"/>
f:apply(f:typeConstructor('xxx'),'03'): <xsl:value-of select="f:apply(f:typeConstructor('xxx'),'03')"/>
f:apply(f:typeConstructor(11),'03') gt 4: <xsl:value-of select="f:apply(f:typeConstructor(11),'03') gt 4"/>
f:type(f:apply(f:typeConstructor(11),'03')): <xsl:value-of select="f:type(f:apply(f:typeConstructor(11),'03'))"/>
f:type(f:apply(f:typeConstructor('string'), 3)): <xsl:value-of select="f:type(f:apply(f:typeConstructor('string'),'03'))"/>
<!-- Supported only by a SA Processor -->
xs:token('abc') : <xsl:value-of select="f:type(xs:token('abc'))"
use-when="system-property('xsl:is-schema-aware')='yes'"/>
-1 : <xsl:value-of select="f:type(-1)"/>
<!-- Supported only by a SA Processor -->
xs:negativeInteger(-1) : <xsl:value-of select="f:type(xs:negativeInteger(-1))"
use-when="system-property('xsl:is-schema-aware')='yes'" />
xs:nonPositiveInteger(0) : <xsl:value-of select="f:type(xs:nonPositiveInteger(0))"
use-when="system-property('xsl:is-schema-aware')='yes'" />
0 : <xsl:value-of select="f:type(0)"/>
3 : <xsl:value-of select="f:type(3)"/>
3. : <xsl:value-of select="f:type(3.)"/>
3.0E1 : <xsl:value-of select="f:type(3.0E1)"/>
xs:float(3) : <xsl:value-of select="f:type(xs:float(3))"/>
<!-- Supported only by a SA Processor -->
xs:positiveInteger(3) : <xsl:value-of select="f:type(xs:positiveInteger(3))"
use-when="system-property('xsl:is-schema-aware')='yes'" />
'3' : <xsl:value-of select="f:type('3')"/>
(/*/*/text())[1] : <xsl:value-of select="f:type((/*/*/text())[1])"/>
data((/*/*/text())[1]) : <xsl:value-of select="f:type(data((/*/*/text())[1]))"/>
</xsl:template>
</xsl:stylesheet>
測試轉化當該XML文檔上施加這種轉變:
<nums>
<num>01</num>
<num>02</num>
<num>03</num>
<num>04</num>
<num>05</num>
<num>06</num>
<num>07</num>
<num>08</num>
<num>09</num>
<num>10</num>
</nums>
有用,corect產生結果:
f:apply(f:typeConstructor(11),'03'): 3
f:apply(f:typeConstructor('xxx'),'03'): 03
f:apply(f:typeConstructor(11),'03') gt 4: false
f:type(f:apply(f:typeConstructor(11),'03')): xs:integer
f:type(f:apply(f:typeConstructor('string'), 3)): xs:string
xs:token('abc') : xs:string
-1 : xs:integer
xs:negativeInteger(-1) : xs:integer
xs:nonPositiveInteger(0) : xs:integer
0 : xs:integer
3 : xs:integer
3. : xs:decimal
3.0E1 : xs:double
xs:float(3) : xs:float
xs:positiveInteger(3) : xs:integer
'3' : xs:string
(/*/*/text())[1] : xml:node
data((/*/*/text())[1]) : xs:string
說明:
f:type()
,如可以從its source可以看出使用內部中的XPath 2.0操作者instance of
和從以多個特定類型直到它確定特定類型的一個最常見的類型測試的值。
0
使用像Saxon 9的企業版本或類似XmlPrime或AltovaXML的模式感知XSLT 2.0處理器,可以使用W3C XML模式在使用XSLT處理輸入文檔時驗證輸入文檔。
0
使用cast as
運算符,例如,
'5' cast as xs:integer
返回5
'foo' cast as xs:integer
拋出Cannot convert string "d" to an integer
使用撒克遜。
如果你想拋出自己的錯誤,你可以使用castable as
,例如
if (not('foo' castable as xs:integer)) then
error((), 'bad')
相關問題
- 1. 如何知道一個dom元素是否是某種類型的標籤
- 2. 如何讓根元素只包含某種類型的多個子元素
- 3. 斷言是否存在任何元素?
- 4. Nightwatch js斷言排序的元素值
- 5. 如何「承諾」,一個值將是某種類型
- 6. phpunit斷言該元素有一個值
- 7. 只能採取某種類型的子元素的選擇器?
- 8. Ruby中的YAML解析:如何獲取某種類型的元素的數組?
- 9. 什麼是完全類型推斷的語言?這種語言的限制?
- 10. XML序列化 - 建立某種類型的子元素列表
- 11. syscall.Sockaddr類型斷言
- 12. 斷言類型.NET
- 13. Ruby中的YAML解析:如何僅獲取某種類型的元素?
- 14. jquery檢索元素沒有某種類
- 15. 如何選擇某種元素?
- 16. 某種類型的字典值
- 17. 如何檢查某個對象是否爲某種類型
- 18. 如何判斷對象是否有某個元素的子元素?
- 19. XSD 1.1斷言子元素
- 20. 如何檢查對象是否是某種類型的數組?
- 21. 如何確定對象是否是某種類型的F#
- 22. 是否可以在SASS中設計某種元素類型的父母?
- 23. 聲明變量是某種類型的
- 24. 是某種類型的對象
- 25. NUnit:斷言IEnumerable是否包含某種類型的對象的最簡潔方法是什麼?
- 26. 序言 - 如何檢查列表是否包含某些元素?
- 27. 你如何找出元素類型的根元素是與jQuery
- 28. 斷言值文字沒有類型是錯誤的?
- 29. 如何獲得某種類型
- 30. 如何獲取某種類型的默認值?