【问题标题】:How to keep namespace prefix while performing XSLT processing如何在执行 XSLT 处理时保留名称空间前缀
【发布时间】: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 工具可能有问题。

标签: xml xslt xslt-2.0


【解决方案1】:

要删除没有内容的元素,可以添加模板规则

&lt;xsl:template match="*[not(child::node())]"/&gt;

正如其他人所说,名称空间信息的丢失是正在使用的工具链中的一个错误。我建议 (a) 准确确定正在使用的工具链,(b) 检查是否存在可能修复错误的相同工具的更高版本,(c) 失败,转移到不同的 XSLT 处理器和/或 XML解析器。

有时发现正在使用的 XSLT 处理器的最简单方法是添加如下内容:

<xsl:template match="/">
  <xsl:comment>Generated using <xsl:value-of select="system-property('xsl:vendor')"/></xsl:comment>
  <xsl:apply-templates/>
</xsl:template>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-03-22
    • 2019-01-02
    • 1970-01-01
    • 2013-09-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多