首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >XSLT连接许多文件

XSLT连接许多文件
EN

Stack Overflow用户
提问于 2016-08-09 14:16:25
回答 1查看 158关注 0票数 0

我有许多这样的XML文件:

File1.xml:

代码语言:javascript
复制
<Document xmlns="Forward">
   <Id>123456789</Id>
 </Document> 

File2.xml:

代码语言:javascript
复制
<Document xmlns="Forward">
   <Id>4568844</Id>
 </Document> 

我想连接这些文件,并在名称空间中添加前缀,如下所示:

产出:

代码语言:javascript
复制
<?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:

代码语言:javascript
复制
<?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>
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-08-09 16:39:23

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

代码语言:javascript
复制
<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>

使用

代码语言:javascript
复制
<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的文件。

那么,对于您的转换,您想要添加。

代码语言:javascript
复制
<xsl:template match="*">
  <xsl:element name="doc:{local-name()}" namespace="Forward">
    <xsl:apply-templates select="@* | node()"/>
  </xsl:element>
</xsl:template>

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38853290

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档