我们想要使用的遗留XML Feed(它耦合到特定数据库并且没有XSD)将“Y”或“N”作为真值发出。我们正在创建一个XSD并自动生成C#类,并进行一些转换以使事情变得更整洁。
因此,如果我在某个对象上有<IsFed>Y</IsFed>
这样的字段,我该如何使用XSLT对这些字段进行转换,以便对xsd:boolean
进行验证?
我对两种方法感兴趣:
示例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>
答案 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
开头,其值为Y
或N
的任何元素的文本,并将其替换为{{1} }或true
。它不会影响名称以false
开头的元素,其值不是Is
或Y
。
对于XSLT 1.0来说,这是同样的事情
N
答案 1 :(得分:1)
- 明确列出要转换的每个字段
醇>
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>
- 自动检测每个这样的是/否字段(我意识到这可能有错误)
醇>
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>