【发布时间】:2017-02-02 16:41:03
【问题描述】:
我有以下输入(为简洁起见,不包括完整文件):
input.xml
<Request>
<EFS>
<child1>
<!-- children -->
</child1>
<child2>
</child2>
<!-- more children etc-->
</EFS>
</Request>
我想删除<Request> 元素,所以<EFS> 成为新的根元素,然后我想将命名空间添加到它。我的 XSL 如下(也缩短了):
我的样式表.xsl
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xs="http://www.w3.org/2001/XMLSchema" version="2.0">
<xsl:output method="xml" indent="yes" version="1.0" encoding="UTF-8" omit-xml-declaration="yes"/>
<xsl:strip-space elements="*" />
<xsl:template match="@*|node()" name="identity">
<xsl:copy>
<xsl:copy-of select="@*" copy-namespaces="no" />
<xsl:apply-templates select="@*|node()" />
</xsl:copy>
</xsl:template>
<xsl:template match="/*">
<xsl:apply-templates select="node()" />
</xsl:template>
<xsl:template match="EFS">
<xsl:element name="EFS" xmlns="'http://www.EFS-standards.org/standards/PC_Surety/EFS1.6.12/xml/Intake'">
<xsl:call-template name="createEFScontent"/>
<xsl:apply-templates/>
</xsl:element>
</xsl:template>
<xsl:template name="createEFScontent">
<xsl:element name="AuditTotal">
<xsl:element name="TransmissionID" />
<xsl:element name="MessageQuantity" />
<xsl:element name="TotalAmt">0.00</xsl:element>
</xsl:element>
</xsl:template>
<!-- rest of stylesheet -->
所以<Request> 被删除,<EFS> 成为新的根。在此之后,我将命名空间应用于<EFS>,输出如下所示:
输出.xml
<EFS xmlns="'http://www.EFS-standards.org/standards/PC_Surety/EFS1.6.12/xml/Intake'">
<AuditTotal xmlns="">
<TransmissionID/>
<MessageQuantity/>
<TotalAmt>0.00</com.LibertyMutual_TotalAmt>
</AuditTotal>
<child1 xmlns="">
//children
</child1>
<child2 xmlns="">
<!-- children -->
</child2>
<!-- rest of output -->
我不确定出了什么问题。我希望输出看起来像现在在子 1 和 2 上没有 xmlns="" 的情况。我需要添加另一个模板来去除这些吗?我在列出的模板中犯了错误吗?
我正在使用 SaxonHE 9.7.0-8,这是在转换步骤中从 Camel 路由中调用的(如果这有什么不同的话)。另外值得注意的是,它仅将空白命名空间应用于子 1 和 2 元素。 EFS 没有其他子元素,但是 child1 和 child2 的子元素没有 xmlns=""
编辑:按照 Tim C 的回答,我已将 Identity 模板替换为他的并添加了模板:
<xsl:template match="@*|text()|comment()|processing-instruction()">
<xsl:copy />
</xsl:template>
这会将命名空间应用于 EFS。当我添加如下模板时,命名空间要么在某些 elelements 上显示为空白,要么显示为完整的命名空间值:
<xsl:template match="EFS/child1/AddRq/Policy">
<xsl:copy>
<xsl:element name="RDDCd">
<xsl:call-template name="getRDDCd" />
</xsl:element>
<xsl:apply-templates select="node()"/>
</xsl:copy>
</xsl:template>
运行时,Policy 将输出 xmlns="" 并且 RDDCd(连同 Policy 的现有子元素)将包含 xmlns=
xsl 中有很多这样的模板;我试图复制匹配元素的现有内容,并添加一个新内容,然后返回标识模板(我想,我对 xsl 不太好)。我做错了什么吗?我的大多数模板都与源中的元素匹配,复制内容并添加一个新的子元素(涵盖样式表中大约 70% 的模板)。如前所述,我一直在以上述方式创建这些模板,剩下的就是删除元素:
<template match="MSDCd" />
或更改元素/子元素的值。
【问题讨论】: