作为这个答案的后续内容,有没有办法可以弄清楚XML值的数据类型是什么? XSL transformation doc in java
例如:
<root>
<test>
true
</test>
<test1>
1
</test1>
<test2>
"abc"
</test2>
</root>
我的想法:
<xsl:template match="/">
<object>
<xsl:for-each select="//*[normalize-space(.)]">
<xsl:choose>
<xsl:when test="contains(., 3)">// want to check for Integer
<Integer name="{name()}">
<xsl:value-of select="."/>
</Integer>
</xsl:when>
<xsl:otherwise>
//check for string, boolean
</xsl:otherwise>
</xsl:choose>
</xsl:for-each>
</object>
</xsl:template>
我想知道如何在XSL中识别数据类型1,&#34; abc&#34;,true为整数,字符串和布尔值?如果有人可以帮助我理解规范化空间(。)如何工作,那将非常有用(:
非常感谢任何帮助。
答案 0 :(得分:0)
您可以在XSLT 2.0中使用castable as
来检查元素的值是否可以转换为xs:integer
或xs:boolean
(或任何其他x datatypes)
示例...
XML输入
<root>
<test>
true
</test>
<test1>
1
</test1>
<test2>
"abc"
</test2>
</root>
XSLT 2.0
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xsl:output indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="test|test1|test2">
<xsl:variable name="type">
<xsl:choose>
<xsl:when test="normalize-space() castable as xs:integer">
<xsl:text>Integer</xsl:text>
</xsl:when>
<xsl:when test="normalize-space() castable as xs:boolean">
<xsl:text>Boolean</xsl:text>
</xsl:when>
<xsl:otherwise>
<xsl:text>String</xsl:text>
</xsl:otherwise>
</xsl:choose>
</xsl:variable>
<xsl:element name="{$type}">
<xsl:attribute name="name" select="name()"/>
<xsl:value-of select="normalize-space()"/>
</xsl:element>
</xsl:template>
</xsl:stylesheet>
XML输出
<root>
<Boolean name="test">true</Boolean>
<Integer name="test1">1</Integer>
<String name="test2">"abc"</String>
</root>
如果您的XML使用架构且您的处理器可识别架构,您还可以使用instance of
来检查类型。
此外,如果您觉得更容易阅读,则可以使用if
语句而不是xsl:choose
...
<xsl:variable name="type" select="
if (normalize-space() castable as xs:integer) then
'Integer'
else if (normalize-space() castable as xs:boolean) then
'Boolean'
else
'String'
"/>