如何使用xslt跳过xml的特定元素

时间:2017-10-28 11:50:25

标签: xml xslt

我的xslt以下。用于规范化整个xml。

normalize_xslt ='''

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="xml" indent="no"/>
    <xsl:template match="*">
        <xsl:attribute name="{local-name()}">
            <xsl:value-of select="."/>
        </xsl:attribute>
    </xsl:template>

    <xsl:template match="/|comment()|processing-instruction()">
        <xsl:copy>
            <xsl:apply-templates/>
        </xsl:copy>
    </xsl:template>

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

    <xsl:template match="@*">
        <xsl:attribute name="{local-name()}">
            <xsl:value-of select="."/>
        </xsl:attribute>
    </xsl:template>

    <xsl:template match="text()">
        <xsl:value-of select="normalize-space(.)"/>
    </xsl:template>
</xsl:stylesheet>'''

它能够正确地规范化xml,但是说我有一个如下的XML:

xml = \

    """
    <rpc-reply xmlns="urn:ietf:params:xml:ns:netconf:base:1.0" xmlns:junos="http://xml.juniper.net/junos/17.4D0/junos" xmlns:nc="urn:ietf:params:xml:ns:netconf:base:1.0" message-id="urn:uuid:5c4d99db-5b2b-4c88-8f69-8fe1d2c29bfe">
<output>
 CPU       Name      Time(ms)
 85%       Idle      4801438332
 13%    Threads      782332270
  0%        ISR      10860088
  0%    Level 1      10854137
  0%    Level 2      5949

Last Long Running Thread Event time 200 ms

 CPU       Name      Time(ms)    Count

 Top Thread:
   pid      = 99
   name     = LU Background Service
   time     = 266630752 ms
   cpu      = 4%

</output>
</rpc-reply>
"""

我想跳过xml元素为<output>的xml 我的xslt需要更改什么?

1 个答案:

答案 0 :(得分:1)

添加通过

复制元素的模板
<xsl:template match="df:output" xmlns:df="urn:ietf:params:xml:ns:netconf:base:1.0">
  <xsl:copy-of select="."/>
</xsl:template>

。如果要“标准化”名称并删除名称空间,请使用

<xsl:template match="df:output" xmlns:df="urn:ietf:params:xml:ns:netconf:base:1.0">
  <xsl:element name="{local-name()}">
    <xsl:value-of select="."/>
  </xsl:element>
</xsl:template>

如果名称空间可以更改,但已知根元素本地名称rpc-replyoutput名称表示您不想更改任何内容,那么您还可以添加例如。

<xsl:template match="/*[local-name() = 'rpc-reply' and *[local-name() = 'output']]">
    <xsl:copy-of select="."/>
</xsl:template>

然后在不应用其他模板的情况下复制任何此类文档。