XSLT连接了很多文件

时间:2016-08-09 14:16:26

标签: xml xslt

我有很多这样的XML文件:

File1.xml:

<Document xmlns="Forward">
   <Id>123456789</Id>
 </Document> 

File2.xml:

<Document xmlns="Forward">
   <Id>4568844</Id>
 </Document> 

我想将这些文件连接起来并在命名空间中添加前缀:

输出:

<?xml version="1.0" encoding="UTF-8"?>
<mes:Fichier xmlns:mes="message">
  <mes:Rcvr>RECEIVE</mes:Rcvr>
  <doc:Document xmlns:doc="Forward">
    <doc:Id>123456789</doc:Id>
  </doc:Document>
  <doc:Document xmlns:doc="Forward">
    <doc:Id>4568844</doc:Id>
  </doc:Document>
</mes:Fichier>

我的XLS:

<?xml version="1.0"?>
<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:mes="message" >
    <xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
    <xsl:strip-space elements="*"/>

    <xsl:param name="Rcvr"/>
    <xsl:param name="fileList"/>

    <xsl:template match="/">
        <xsl:copy>
            <mes:Fichier xmlns:mes="message" >
                <mes:Rcvr><xsl:value-of select="$Rcvr"/></mes:Rcvr>
                <xsl:apply-templates select="@*|node()" />
            </mes:Fichier>
        </xsl:copy>
    </xsl:template>


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

</xsl:stylesheet>

1 个答案:

答案 0 :(得分:1)

所以你有两个任务,读取一堆文件并转换它们。假设Saxon 9作为您的XSLT处理器,您可以替换

<xsl:template match="/">
    <xsl:copy>
        <mes:Fichier xmlns:mes="message" >
            <mes:Rcvr><xsl:value-of select="$Rcvr"/></mes:Rcvr>
            <xsl:apply-templates select="@*|node()" />
        </mes:Fichier>
    </xsl:copy>
</xsl:template>

<xsl:template match="/">
        <mes:Fichier xmlns:mes="message" >
            <mes:Rcvr><xsl:value-of select="$Rcvr"/></mes:Rcvr>
            <xsl:apply-templates select="collection('.?select=file*.xml')/node()" />
        </mes:Fichier>
</xsl:template>

读入并处理名为file*.xml的所有文件。

然后为了你的转换,你想要添加例如。

<xsl:template match="*">
  <xsl:element name="doc:{local-name()}" namespace="Forward">
    <xsl:apply-templates select="@* | node()"/>
  </xsl:element>
</xsl:template>

如果涉及更多名称空间,您可能需要将该匹配限制为要添加前缀的名称空间。将新根元素的名称空间声明移动到样式表的根元素是有意义的。