0

2つのXMLをマージし、別のテンプレートを使用して結果を変換するXSLT変換に取り組んでいます。元のXMLファイルのフィールドに応じて、secongXMLが変化するという考え方です。例えば:

<?xml version="1.0" encoding="UTF-8"?>
<data>
 <information>
  <stmtinfo>
   <type>80</type>
   <language>2</language>
   <clientnum>15907</clientnum>
   <clientname>bogus</clientname>
   <clientaddress>1401 Barnacle Street, Miami, Fl</clientaddress>
  </stmtinfo>
 </information>
</data>

言語ノードの値(これをLANGと呼びましょう)に応じて、language{LANG}.xmlというファイルを追加する必要があります。これらのファイルの内容は次のとおりです。

<?xml version="1.0" encoding="UTF-8"?>
<labels>
 <l1001>cliente</l1001>
 <l1002>moneda de referencia</l1002>
</labels>

このようなものに:

<?xml version="1.0" encoding="UTF-8"?>
<document>
 <information>
  <stmtinfo>
   <type>80</type>
   <language>2</language>
   <clientnum>15907</clientnum>
   <clientname>bogus</clientname>
   <clientaddress>1401 Barnacle Street, Miami, Fl</clientaddress>
  </stmtinfo>
 </information>
 <labels>
  <l1001>cliente</l1001>
  <l1002>moneda de referencia</l1002>
 </labels>
</document>

そして、その結果は変換されるべきです。マージを行うために次のテンプレートを作成しました。

<?xml version="1.0" encoding="ISO-8859-1"?>
<xsl:stylesheet version="1.0" xmlns:xalan="http://xml.apache.org/xalan" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:fo="http://www.w3.org/1999/XSL/Format" xmlns:svg="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:java="http://xml.apache.org/xalan/java/java.lang" xmlns:xfc="http://www.metafocus.no/digiforms/component">
 <xsl:template match="data">
  <document>
   <xsl:call-template name="copy"/>
   <xsl:variable name="label_file_name" select="concat('Labels_',information/stmtinfo/language,'.xml')"/>
   <xsl:variable name="labels">
    <xsl:copy-of select="document($label_file_name)"/>
   </xsl:variable>
   <xsl:for-each select="xalan:nodeset($labels)/node()">
    <xsl:call-template name="copy"/>
   </xsl:for-each>
  </document>
 </xsl:template>
 <xsl:template name="copy">
  <xsl:copy-of select="."/>
 </xsl:template>
</xsl:stylesheet>

そのテンプレートを使用すると、次のようになります。

<?xml version="1.0" encoding="UTF-8"?><document xmlns:xfc="http://www.metafocus.no/digiforms/component" xmlns:java="http://xml.apache.org/xalan/java/java.lang" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:svg="http://www.w3.org/2000/svg" xmlns:fo="http://www.w3.org/1999/XSL/Format" xmlns:xalan="http://xml.apache.org/xalan"><data>
 <information>
  <stmtinfo>
   <type>80</type>
   <language>2</language>
   <clientnum>15907</clientnum>
   <clientname>bogus</clientname>
   <clientaddress>1401 Barnacle Street, Miami, Fl</clientaddress>
  </stmtinfo>
 </information>
</data><labels>
 <l1001>cliente</l1001>
 <l1002>moneda de referencia</l1002>
</labels></document>

どちらが正しいようです。ただし、他のテンプレートから呼び出した場合は、結果のXMLを処理します

<xsl:template match="/">
 <xsl:variable name="link1">
  <xsl:apply-templates mode="link1" select="node()"/>
 </xsl:variable>
 <xsl:value-of select="xalan:nodeset($link1)"/>
</xsl:template>

私は以下を取得しています

80215907偽物1401BarnacleStreet、Miami、FL

結果をノードセットに変換すると、ノードの「ラベル」が消えてしまうため、マージが正しく機能していないようです。私が間違っているのは何ですか?

どうもありがとうございます。

ホセ

4

2 に答える 2

1

そもそもなぜ2パス変換をしているのですか?あなたがちょうど置くならば、私には思われます:

<xsl:variable name="labels" select="document(concat(
   'Labels_', 
   /data/information/stmtinfo/language, 
   '.xml'))"/>

$labelsドキュメントの上部で、テンプレートで明示的に参照できます。変換の最初のパスの結果は、構造がソースXMLと十分に異ならないため、2つのパスで実行することで複雑さ以外の何かを実際に得ることができます。

とは言うものの、書かれている変換の問題は、ほぼ確実に、これを実行していることです。

<xsl:value-of select="xalan:nodeset($link1)"/>

これの代わりに:

<xsl:copy-of select="xalan:nodeset($link1)"/>

要素の値は、そのすべての子孫テキストノードの連結であり、それが出力で得られるものです。

于 2009-12-18T22:28:54.883 に答える
0

次のようにして、変換を単純化しました。

<xsl:template match="data">
    <xsl:variable name="labels" select="document(concat('Labels_',/data/information/stmtinfo/language,'.xml'))"/>
        <xsl:call-template name="letter-layout"/>
        type=<xsl:value-of select="/data/information/stmtinfo/type"/>
        label=<xsl:copy-of select="$labels/l1001"/>
</xsl:template>

しかし、私はラベルを埋めていません。

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

/l1101 を使用しない場合、次のようになります。

<?xml version="1.0" encoding="UTF-8"?>
            type=80
            label=<labels>
    <l1001>cliente</l1001>
    <l1002>moneda de referencia</l1002>
</labels>

だから私は、インポートされたxmlがノードセットとしてではなく、テキストとして扱われているという印象を受けています

于 2009-12-18T23:34:49.000 に答える