1

次の XML があります。

<xml version="1.0" encoding="UTF-8">
    <query>
        <row> 
            <Name>Ed</Name> 
            <ID>11</ID> 
        </row> 
        <row> 
            <Name>Chad</Name> 
            <ID>12</ID> 
        </row> 
        <row> 
            <Name>Jason</Name> 
            <ID>13</ID> 
        </row>
    </query>
</xml>

XSLT を使用して次のことを行いたいと考えています。

<create a variable that is a copy of the entire XML document>
<append an additional node to the XML in the variable>
<loop through each <row> inside the new variable and output the name and ID>

変数の内部では、この XML で終了したいと考えています。

<xml version="1.0" encoding="UTF-8">
    <query>
        <row> 
            <Name>Ed</Name> 
            <ID>11</ID> 
        </row> 
        <row> 
            <Name>Chad</Name> 
            <ID>12</ID> 
        </row> 
        <row> 
            <Name>Jason</Name> 
            <ID>13</ID> 
        </row>
        <row> 
            <Name>Mark</Name> 
            <ID>14</ID> 
        </row>
    </query>
</xml>

そして、この出力で終わります:

Ed
11

Chad
12

Jason
13

Mark 
14

変数を使用する理由は、Oracle BI Publisher 用の Microsoft Word プラグインを使用しているためです。このプラグインを使用すると、クエリから XML の結果を取得して PDF ファイルを生成する XSLT を使用してテンプレートを作成できます。その基本的には派手な差し込み印刷です。ただし、データをループ処理する前に XML ドキュメントに追加する必要がある、クエリによって返されない行がいくつかあります。

テンプレートの性質上、XML を処理する前に外部 XSL ファイルを使用して XML を変更することはできないと思います。したがって、私が考えることができる唯一のことは、すべての XML で変数を作成し、クエリによって返されない追加のノードを変数の XML に追加し、その変数をループして値を出力することです。私は SO を検索していて、このような投稿を見つけましたが、結果を変更された XML ファイルにしたくありません。変数のようにテンプレート内ですぐに使用できるものにしたいのです。

4

1 に答える 1

0

これはそれを行う必要があります:

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:msxsl="urn:schemas-microsoft-com:xslt" exclude-result-prefixes="msxsl"
>
  <xsl:output method="text" />

  <xsl:template match="/query">
    <xsl:variable name="xmlFragment">
      <query>
        <xsl:copy-of select="*"/>
        <row>
          <Name>Mark</Name>
          <ID>14</ID>
        </row>
      </query>
    </xsl:variable>
    <xsl:for-each select="msxsl:node-set($xmlFragment)/query/*">
      <xsl:value-of select="Name"/>
      <xsl:text xml:space="preserve">
</xsl:text>
      <xsl:value-of select="ID"/>
      <xsl:text xml:space="preserve">
</xsl:text>
      <xsl:text xml:space="preserve">
</xsl:text>
    </xsl:for-each>
  </xsl:template>

</xsl:stylesheet>

変数には XML フラグメントが含まれており、これをノード セットに変換して使用する必要があります。for-eachこれは、Microsoft 固有の拡張機能msxsl:node-set()で行われます。他の XSLT プロセッサには同等の機能があります。

(なぜ変数が必要なのか完全にはわかりません-仕事は直接行うことができると思いますが、いずれにしても上記のコードは最初に変数を作成してから列挙します)

于 2013-08-02T13:46:47.663 に答える