1

xmlを新しい構造に変換してから、変換内で新しい構造を処理しようとしています。私の問題は、新しい構造をノードセットとして使用できるようにすることです。Webアプリケーションのライブラリでsaxon9heとともにTomcat6を使用しています。新しい構造の使いやすさをテストするために、次のxslを作成しました。

<?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" omit-xml-declaration="no" indent="yes" encoding="UTF-8"/>

<xsl:include href="nodeTest.xsl"/>
<xsl:variable name="theDoc"> 
  <doc>
    <source>from</source>
    <source>here</source>
    <target>to</target>
    <target>there</target>
  </doc>
</xsl:variable>

<xsl:template match="/">
  <xsl:variable name="result1">
    <xsl:call-template name="createLinks">
    <xsl:with-param name="doc" select="$theDoc/doc/*"/>
    </xsl:call-template>
  </xsl:variable>
input:
<xsl:value-of select="$theDoc/doc/*"/>
output:
<xsl:value-of select="$result1"/>
</xsl:template>

</xsl:stylesheet>

変数theDocには有効なノードセットが含まれ、createLinksテンプレートはそれをノードセットとして処理することを期待しています。これがcreatlelInksテンプレートです。

<?xml version="1.0" encoding="UTF-8"?>

<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" > 

<xsl:template match="node()" mode="makeLink"> 
  <xsl:param name="theSource" select="'source'"/>
  <xsl:param name="theTarget" select="'target'"/>
  <xsl:param name="theUsage" select="'usage'"/>
  <xsl:element name="link" >
  <xsl:element name="usage" ><xsl:value-of select="$theUsage"/></xsl:element>
  <xsl:element name="source" ><xsl:value-of select="$theSource"/></xsl:element>
  <xsl:element name="target" ><xsl:value-of select="$theTarget"/></xsl:element>
  </xsl:element>    
</xsl:template>

<xsl:template name="createLinks">
<xsl:param name="doc" select="*"/>
the input doc:
<xsl:value-of select="$doc"/>
<xsl:copy>
  <xsl:element name="Links">
        <xsl:apply-templates mode="makeLink" select=".">
      <xsl:with-param name="theUsage" select="'link from source to target'"/>
      <xsl:with-param name="theSource" select="$doc/source/*"/>
      <xsl:with-param name="theTarget" select="$doc/target/*"/>
        </xsl:apply-templates>
  </xsl:element>
   </xsl:copy>
</xsl:template>

</xsl:stylesheet>

実行すると、結果は次のようになります。

<?xml version="1.0" encoding="UTF-8"?>
input:
from here to there
output:

the input doc:
fromheretotherelink from source to target

theDocがノードセットではないことは明らかです。私の理解では、xslt 2.0標準では、結果ツリーフラグメントではなく、ノードセットとしてtheDocが使用されます。これらの単純なxslsを変更して、Docの内容をノードセットとして処理するにはどうすればよいですか?

4

2 に答える 2

2

あなたがどのようにあなたの結論に達したかは私には明らかではありません:

「theDoc がノード セットではないことは明らかです。私の理解では、xslt 2.0 標準では、ノード セットとして theDoc が使用され、結果ツリー フラグメントではありません。これらの単純な xsl を変更して、theDoc のコンテンツをノードセット?」

ここでの最初の問題は、XSLT 1.0 データ モデル用語を使用していることです。2.0 では、ノード セットはなく、シーケンスのみであり、結果ツリー フラグメントのようなものはありません。

$theDoc の値はドキュメント ノードです。このドキュメント ノードには、doc という子要素があり、さらに、source、source、result、result という 4 つの子要素があります。

これを行う場合:

<xsl:value-of select="$doc"/>

このドキュメント ノードの文字列値を出力します。これは、子孫テキスト ノードの連結、つまりfromheretothereです。

これを行う場合:

<xsl:value-of select="$result1"/>

$result1 の文字列値を出力します。これはそれ自体がドキュメント ノードです。このドキュメント ノードには link と呼ばれる子があり、usage、source、および target と呼ばれる 3 つの子があります。usage 要素には「ソースからターゲットへのリンク」というテキスト コンテンツがあり、ソース要素とターゲット要素は両方とも空です。それらが空である理由は、式$doc/source/*$doc/target/*が何も選択しないためです。$doc には doc という子があるため、何も選択しません。ソース要素とターゲット要素はその孫です。

于 2013-02-03T22:55:37.167 に答える
1

XSLTには、期待どおりに機能しなくなる問題がいくつかあります。1つ目は、xsl:value-ofを使用して変数の値を表示する場所です。例えば

<xsl:value-of select="$doc"/>

これは、ノードセットのテキスト値のみを表示します。ノードのコピーを返すには、実際にはxsl:copy-ofを使用する必要があります。

<xsl:copy-of select="$doc" />

xsl:value-ofのすべての出現箇所をxsl:copy-ofに置き換えて、どのように処理するかを確認してください。

次に、「makelink」テンプレートを呼び出すときにパラメータに問題があります

<xsl:with-param name="theSource" select="$doc/source/*"/>
<xsl:with-param name="theTarget" select="$doc/target/*"/>

*は、ソース要素とターゲット要素の子要素に一致しますが、子要素はなく、子テキストノードのみです(要素はノードですが、すべてのノードが要素であるとは限りません)。あなたはおそらくこれをしたいでしょう....

<xsl:with-param name="theSource" select="$doc/source"/>
<xsl:with-param name="theTarget" select="$doc/target"/>

実際、テンプレートの呼び出し方法が原因で、それでも機能しません。

<xsl:call-template name="createLinks">
    <xsl:with-param name="doc" select="$theDoc/doc/*"/>
</xsl:call-template>

このように呼ぶことは、ソースターゲットが最上位の要素であることを意味します。代わりにこれを実行したいと思うかもしれません...

 <xsl:call-template name="createLinks">
     <xsl:with-param name="doc" select="$theDoc/doc"/>
 </xsl:call-template>
于 2013-02-03T22:21:31.353 に答える