0

我正在研究一个 XSLT 转换,它包括合并两个 XML,然后使用另一个模板转换结果。这个想法是,根据原始 XML 文件的字段,secong XML 会发生变化。例如:

<?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>

我正在获得以下内容

80 2 15907 bogus 1401 Barnacle Street, Miami, Fl

所以似乎合并无法正常工作,因为如果我将结果转换为节点集,节点“标签”就会消失。我做错了什么?

非常感谢你。

何塞

4

2 回答 2

1

为什么你首先要进行两次转换?在我看来,如果你只是把:

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

在文档顶部,然后您可以$labels在模板中明确引用。第一次转换的结果在结构上与源 XML 并没有太大的不同,因此在两次转换中除了复杂性之外,您确实获得了任何东西。

也就是说,所写转换中的问题几乎可以肯定是您正在这样做:

<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 回答