将XML“yes / no”字符串转换为boolean

时间:2016-07-12 15:59:58

标签: xml xslt xslt-1.0

我们想要使用的遗留XML Feed(它耦合到特定数据库并且没有XSD)将“Y”或“N”作为真值发出。我们正在创建一个XSD并自动生成C#类,并进行一些转换以使事情变得更整洁。

因此,如果我在某个对象上有<IsFed>Y</IsFed>这样的字段,我该如何使用XSLT对这些字段进行转换,以便对xsd:boolean进行验证?

我对两种方法感兴趣:

  1. 明确列出要转换的每个字段
  2. 自动检测每个这样的是/否字段(我意识到这可能有错误)
  3. 示例XML可能如下所示:

    <Animal type="hamster">
     <IsFed>Y</IsFed>
     <Name>Gerald</Name>
    </Animal>
    <Animal type="cow">
     <IsFed>N</IsFed>
     <Name>acv4445-7</Name>
    </Animal>
    

    它应该像:

    <Animal type="hamster">
     <IsFed>true</IsFed>
     <Name>Gerald</Name>
    </Animal>
    <Animal type="cow">
     <IsFed>false</IsFed>
     <Name>acv4445-7</Name>
    </Animal>
    

2 个答案:

答案 0 :(得分:1)

有趣的小问题。这是XSLT 2的一种可能解决方案(下面是XSLT 1解决方案)

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    version="2.0">
    <xsl:template match="@*|node()">
        <xsl:copy>
            <xsl:apply-templates select="@*|node()"/>
        </xsl:copy>
    </xsl:template>
    <xsl:template match="*[starts-with(name(),'Is') and matches(text(),'[YN]')]/text()">
        <xsl:value-of select="if (.='Y') then 'true' else 'false'"></xsl:value-of>
    </xsl:template>
</xsl:stylesheet>

这是一个标识转换加上一个模板,该模板匹配名称以Is开头,其值为YN的任何元素的文本,并将其替换为{{1} }或true。它不会影响名称以false开头的元素,其值不是IsY

对于XSLT 1.0来说,这是同样的事情

N

答案 1 :(得分:1)

  
      
  1. 明确列出要转换的每个字段
  2.   

XSLT 1.0

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
<xsl:strip-space elements="*"/>

<!-- identity transform -->
<xsl:template match="@*|node()">
    <xsl:copy>
        <xsl:apply-templates select="@*|node()"/>
    </xsl:copy>
</xsl:template>

<!-- list every boolean element here -->
<xsl:template match="IsFed | HasShelter | etc.  ">
    <xsl:copy>
        <xsl:value-of select=".='Y'"/>
    </xsl:copy>
</xsl:template>

</xsl:stylesheet>
  
      
  1. 自动检测每个这样的是/否字段(我意识到这可能有错误)
  2.   

XSLT 1.0

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
<xsl:strip-space elements="*"/>

<!-- identity transform -->
<xsl:template match="@*|node()">
    <xsl:copy>
        <xsl:apply-templates select="@*|node()"/>
    </xsl:copy>
</xsl:template>

<xsl:template match="text()[.='Y']">true</xsl:template>
<xsl:template match="text()[.='N']">false</xsl:template>

</xsl:stylesheet>