我正在使用XSL文件转换另一个使用Y和N值而不是true和false的XML。如何定义所有Y或N应该变为真或假,而不必在我访问原始数据的每一行中都这样做?
原始XML:
<whatever>
<water>N</water>
<electricity>Y</electricity>
<internet>Y</internet>
</whatever>
XSL,现在我必须每次将Y翻译为真:
<whatever>
<water><!-- xsl translation here --></water>
<electricity><!-- xsl translation here --></electricity>
<internet><!-- xsl translation here --></internet>
</whatever>
理想的XSL:
<whatever>
<!-- Something magic that will automatically change all value-of output-->
<water><xsl:value-of select="//water"/></water>
<electricity><xsl:value-of select="//electricity"/></electricity>
<internet><xsl:value-of select="//internet"/></internet>
</whatever>
输出:
<whatever>
<water>false</water>
<electricity>true</electricity>
<internet>true</internet>
</whatever>
答案 0 :(得分:3)
更简单,更高效的XSLT 1.0样式表将是......
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="text()[.='Y']">
<xsl:value-of select="'true'" />
</xsl:template>
<xsl:template match="text()[.='N']">
<xsl:value-of select="'false'" />
</xsl:template>
</xsl:stylesheet>
...或等效......
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/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>
答案 1 :(得分:1)
使用标识模板处理XML并保持相同的结构。
添加一个模板,将文本节点“Y”和“N”转换为true和false。
<?xml version="1.0" ?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" omit-xml-declaration="yes"/>
<!-- put your templates here -->
<xsl:template match="text()">
<xsl:choose>
<xsl:when test=".='Y'">true</xsl:when>
<xsl:when test=".='N'">false</xsl:when>
<xsl:otherwise><xsl:copy/></xsl:otherwise>
</xsl:choose>
</xsl:template>
<!-- identity templates -->
<xsl:template match="*">
<xsl:copy>
<xsl:apply-templates select="@*"/>
<xsl:apply-templates select="node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="@*|comment()|processing-instruction()">
<xsl:copy/>
</xsl:template>
</xsl:stylesheet>
有关身份模板的更多信息,请参阅http://www.ibm.com/developerworks/web/library/x-tipxsltidentitytpl/index.html。
答案 2 :(得分:1)
只需使用:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="node()|@*">
<xsl:copy>
<xsl:apply-templates select="node()|@*"/>
</xsl:copy>
</xsl:template>
<xsl:template match="text()[. = 'Y' or . = 'N']">
<xsl:value-of select=". = 'Y'"/>
</xsl:template>
</xsl:stylesheet>
在提供的XML文档上应用此转换时:
<whatever>
<water>N</water>
<electricity>Y</electricity>
<internet>Y</internet>
</whatever>
产生了想要的正确结果:
<whatever>
<water>false</water>
<electricity>true</electricity>
<internet>true</internet>
</whatever>
<强>解释强>:
使用并覆盖 identity rule 。
覆盖模板中的所有内容都是输出简单XPath表达式的结果. = 'Y'