XSLT:将两个文件复制到一个通用结构中

时间:2018-06-20 17:08:47

标签: xslt ssis data-profiling

我尝试将用于多个表的SSIS Data Profiler Task的结果合并为一个XML,以检查“ Data Profiler Viewer”内一个文件中的结果。整个问题缩小到这里唯一的简化XML转换:

文件1(test_1.xml):

<a xmlns="http://schemas.microsoft.com/sqlserver/2008/DataDebugger/">
   <b id="1"/>
   <c>
      <2: any other XML-structure to come here/>
   </c>
</a>

文件2(test_2.xml):

<a xmlns="http://schemas.microsoft.com/sqlserver/2008/DataDebugger/">
   <b id="1"/>
   <c>
      <1: any other XML-structure to come here/>
   </c>
</a>

(元素b总是完全相同)

预期结果:

<a xmlns="http://schemas.microsoft.com/sqlserver/2008/DataDebugger/">
   <b id="1"/>
   <c>
      <1: any other XML-structure to come here/>
      <2: any other XML-structure to come here/>
   </c>
</a>

建议任何帮助!我将在此处为原始问题提供解决方案。

1 个答案:

答案 0 :(得分:0)

另一种尝试:

<?xml version='1.0' encoding="utf-8"?>
<xsl:stylesheet 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns:t="http://schemas.microsoft.com/sqlserver/2008/DataDebugger/"
    version="1.0">

    <xsl:output method="xml" indent="yes" omit-xml-declaration="no" version="1.0" encoding="UTF-8"/>

    <xsl:template match="t:c">
        <xsl:element name="c" namespace="http://schemas.microsoft.com/sqlserver/2008/DataDebugger/">
        <xsl:copy-of select="*" />
        <xsl:copy-of select="document('test_2.xml')//t:c/node() " />
        </xsl:element>
    </xsl:template>

    <xsl:template match="node()|@*">
        <xsl:copy>
            <xsl:apply-templates select="node()|@*"/>
        </xsl:copy>
    </xsl:template>

</xsl:stylesheet>

使用xalan检查(在环境中设置类路径)

java org.apache.xalan.xslt.Process -IN test1_1.xml -XSL test1.xslt -OUT test1_12.xml 

和撒克逊人(将skript更改为Version =“ 1.1”)

java -jar saxon-9.1.0.8j.jar -s:test_1.xml -xsl:test_1.xslt -o:test_12.xml