6

XSLT でインクリメントを使用しようとしています。出力をtxtファイルに書き込みます。これが私のコードです:Xsltコード:

<?xml version="1.0"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" >
    <xsl:output method="text"/>
    <xsl:result-document href="foo.txt" method=text />
    <xsl:template match="/">
    </xsl:template>

  <xsl:template match="/build/build">
    <xsl:variable name="buildNumber" select="."/>
    <xsl:element name="build">
      <xsl:value-of select="$buildNumber + 1"/>
    </xsl:element>
  </xsl:template>

  <xsl:template match="/|@*|node()">
    <xsl:value-of select="build/major"/>
    <xsl:value-of select="build/minor"/>
    <xsl:value-of select="build/build"/>
    <xsl:value-of select="build/release"/>
      <xsl:copy>
        <xsl:apply-templates select="@*|node()"/>
      </xsl:copy>  
  </xsl:template>
</xsl:stylesheet>

XML コードは次のとおりです。

 <?xml version="1.0" encoding="utf-8"?>
    <?xml-stylesheet type="text/xsl" href="E:\Build\genVer.xsl"?>
    <build>
        <major>1.</major><minor>0.</minor><build>0</build><release>.0</release>
    </build>

使用してみましたが、 orの子にはできない<xsl:result-document>というエラーが表示されます。ありがとうございました<xsl:result-document><xsl:stylesheet><xsl:template>

4

2 に答える 2

10

あなたのアプローチ<xsl:result-document>は完全に健全です。唯一の問題は、スタイルシートが XSLT 1 であり、<xsl:result-document>XSLT 2 が必要なことです。XSLT が関数型言語であることは、この問題とは何の関係もありません。

必要に応じて、使用する XSLT コードを投稿<xsl:result-document>してください。修正します。

編集:

必要な変更を加えたコードを次に示します。などの元のコードの一部はmethod="text"、結果をテキスト ファイルにすることを示していますが<xsl:element>、XML ファイルを出力しようとしているように見えるため、両方のコードを記述しました。前述のとおり、<xsl:result-document>XSLT 2 が必要です。

これにより、XML ファイルが作成されます。

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
   <xsl:output method="xml"/>

   <xsl:template match="/">
      <xsl:variable name="foldername" select="concat(/build/major, /build/minor, string(/build/build + 1), build/release)"/>
      <xsl:result-document href="{$foldername}/foo.xml" method="xml">
         <xsl:copy>
            <xsl:apply-templates/>
         </xsl:copy>
      </xsl:result-document>
   </xsl:template>

   <xsl:template match="element()">
      <xsl:copy>
         <xsl:apply-templates/>
      </xsl:copy>
   </xsl:template>

   <xsl:template match="/build/build">
      <xsl:copy>
         <xsl:variable name="buildNumber" select="."/>
         <xsl:value-of select="$buildNumber + 1"/>
      </xsl:copy>
   </xsl:template>

</xsl:stylesheet>

これにより、テキストファイルが作成されます。

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
   <xsl:output method="text"/>

   <xsl:template match="/">
      <xsl:variable name="foldername" select="concat(/build/major, /build/minor, string(/build/build + 1), build/release)"/>
      <xsl:result-document href="{$foldername}/foo.txt" method="text">
         <xsl:apply-templates/>
      </xsl:result-document>
   </xsl:template>

   <xsl:template match="element()">
      <xsl:apply-templates/>
   </xsl:template>

   <xsl:template match="/build/build">
      <xsl:variable name="buildNumber" select="."/>
      <xsl:value-of select="$buildNumber + 1"/>
   </xsl:template>

</xsl:stylesheet>

出力ファイルは、必要に応じてバージョン名のフォルダーに作成されますが、フォルダーは事前に存在している必要があることに注意してください。

于 2013-03-29T16:44:22.257 に答える