1

我正在使用 XSL 文件来转换另一个使用 Y 和 N 值而不是 true 和 false 的 XML。如何定义一次所有 Y 或 N 都应该变为真或假,而不必在我访问原始数据的每一行中都这样做?

原始 XML:

<whatever>
 <water>N</water>
 <electricity>Y</electricity>
 <internet>Y</internet>
</whatever>

XSL,现在我必须每次将 Y 转换为 true:

<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>
4

3 回答 3

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>
于 2012-08-15T01:15:40.813 回答
1

使用标识模板来处理 XML 并保持相同的结构。

添加一个将文本节点“Y”和“N”转换为真假的模板。

<?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

于 2012-08-14T20:55:08.827 回答
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. 使用和覆盖身份规则

  2. 在覆盖模板中您想要的只是输出简单 XPath 表达式的结果. = 'Y'

于 2012-08-15T04:18:57.207 回答