1

XSLファイルを使用して、trueとfalseの代わりにYとNの値を使用する別のXMLを変換しています。すべてのYまたはNがtrueまたはfalseになり、元のデータにアクセスしているすべての行でそれを行う必要がないことを一度定義するにはどうすればよいですか?

元の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

IDテンプレートを使用して、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>

IDテンプレートの詳細については、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. ID ルールの使用とオーバーライド。

  2. オーバーライド テンプレートで必要なのは、単純な XPath 式の結果を出力することだけです。. = 'Y'

于 2012-08-15T04:18:57.207 に答える