【发布时间】:2016-07-18 13:23:29
【问题描述】:
请查看 XSLT、输入 XML、所需输出 XML 和实际输出,我在下面。
- 如果标签没有值或空白,我需要删除所有标签。
例如:删除
<abc></abc> - 使用下面的 XSLT,空标签被转换为 自闭标签(我完全想删除),命名空间也被删除
例如:
<soapenv:Body>转换为<Body>(我想保持原样) - 请帮助我在不删除命名空间前缀的情况下实现所需的输出。
XSLT
<xsl:stylesheet version="2.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()" />
</xsl:copy>
</xsl:template>
<xsl:template match="grandParent">
<xsl:copy>
<xsl:apply-templates select="@*" />
<childValues>
<xsl:value-of select="normalize-space(.)" />
</childValues>
<xsl:apply-templates select="node()" />
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
输入 XML--
<?xml version="1.0" encoding="UTF-8"?>
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
<soapenv:Body>
<netconf:rpc xmlns:netconf="urn:ietf:params:xml:ns:netconf:base:1.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
message-id="81">
<netconf:edit-config>
<netconf:target>
<netconf:url/>
</netconf:target>
<netconf:config>
<requests module="E5100">
<request action="create" userName="sigma" sessionId="_sessionId">
<SSA>
<NetworkName>NTWK-ntwk_nm</NetworkName>
<PortNumber>2</PortNumber>
<PortType>vdsl</PortType>
<SSAProvision>
<UserDescr></UserDescr>
<SubscriberID></SubscriberID>
</SSAProvision>
</SSA>
</request>
</requests>
</netconf:config>
</netconf:edit-config>
</netconf:rpc>
</soapenv:Body>
</soapenv:Envelope>
所需的输出 XML:
<?xml version="1.0" encoding="UTF-8"?>
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
<soapenv:Body>
<netconf:rpc xmlns:netconf="urn:ietf:params:xml:ns:netconf:base:1.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
message-id="81">
<netconf:edit-config>
<netconf:target>
<netconf:url/>
</netconf:target>
<netconf:config>
<requests module="E5100">
<request action="create" sessionId="_sessionId" userName="sigma">
<SSA>
<NetworkName>NTWK-ntwk_nm</NetworkName>
<!-- Port Number removed-->
<PortType>vdsl</PortType>
<SSAProvision>
<UserDescr/>
<SubscriberID/>
</SSAProvision>
</SSA>
</request>
</requests>
</netconf:config>
</netconf:edit-config>
</netconf:rpc>
</soapenv:Body>
</soapenv:Envelope>
实际输出:
<?xml version="1.0" encoding="UTF-8"?>
<Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
<Body>
<rpc xmlns:netconf="urn:ietf:params:xml:ns:netconf:base:1.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
message-id="81">
<edit-config>
<target>
<url/>
</target>
<config>
<requests module="E5100">
<request action="create" sessionId="_sessionId" userName="sigma">
<SSA>
<NetworkName>NTWK-ntwk_nm</NetworkName>
<!-- want to remove this PortNumber completely-->
<PortNumber/>
<PortType>vdsl</PortType>
<SSAProvision>
<UserDescr/>
<SubscriberID/>
</SSAProvision>
</SSA>
</request>
</requests>
</config>
</edit-config>
</rpc>
</Body>
</Envelope>
【问题讨论】:
-
1. 使用您的代码无法重现您的问题 - 请参阅:xsltransform.net/94rmq7j -- 2. 中没有
grandParent元素你的 XML 输入,所以第二个模板不做任何事情。 -
谢谢迈克尔,我对此非常陌生,由于某种原因,我必须尽快让它工作。我同意在在线 xslt 解析器上这是可行的,但是在我正在尝试的环境中以及在某些基于 Java 的公司特定工具中,它正在删除名称空间前缀。关于可能出错或我需要检查什么的任何指针。
-
我假设您知道输出文档的节点仍在正确的命名空间中(命名空间未被删除)并且任何解析器或 XML 处理工具都应该可以工作,无论您是设置默认命名空间还是通过前缀显式设置命名空间。
-
@Ramesh 对不起,我不知道。我只能说符合标准的 XSLT 处理器不会产生您声称的结果。显然您的问题与 XSLT 无关。
-
@Ramesh:恭喜您对问题提供了非常详尽的文档——输入、代码、预期输出和实际输出。您使用的是什么 XSLT 环境,似乎产生了不合格的输出?在我看来,您公司特定的 java 工具可能有问题。