【问题标题】:Merge two XML and then transform the merged xml合并两个 XML,然后转换合并的 xml
【发布时间】:2009-12-18 21:20:53
【问题描述】:

我正在做一个 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 虚假 佛罗里达州迈阿密市藤壶街 1401 号

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

非常感谢。

何塞

【问题讨论】:

    标签: xml merge transform


    【解决方案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)"/>
    

    元素的值是其所有后代文本节点的串联,这就是您在输出中得到的内容。

    【讨论】:

      【解决方案2】:

      我通过执行以下操作简化了转换:

      <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 被视为文本,而不是节点集

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2019-01-25
        • 2020-06-16
        • 1970-01-01
        • 2019-08-25
        • 2011-06-23
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多