识别XSL内每个元素的数据类型

时间:2015-08-17 20:48:24

标签: xml xslt

作为这个答案的后续内容,有没有办法可以弄清楚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为整数,字符串和布尔值?如果有人可以帮助我理解规范化空间(。)如何工作,那将非常有用(:

非常感谢任何帮助。

1 个答案:

答案 0 :(得分:0)

您可以在XSLT 2.0中使用castable as来检查元素的值是否可以转换为xs:integerxs: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'
"/>