使用XSL翻译数据

时间:2012-08-14 19:22:28

标签: xml xslt

我正在使用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>

3 个答案:

答案 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>

<强>解释

  1. 使用并覆盖 identity rule

  2. 覆盖模板中的所有内容都是输出简单XPath表达式的结果. = 'Y'

相关问题