【问题标题】:Filter specific child nodes along with the parent过滤特定的子节点和父节点
【发布时间】:2013-08-07 22:10:08
【问题描述】:

我只需要检索父节点以及匹配特定属性值的子节点。输入 XML 是

<ErrorList>
    <Table name="Table1" type="A">
        <Error category="Minor">
            <errorCode>100</errorCode>
            <errorMessage>msg-100</errorMessage>
        </Error>
        <Error category="Major">
            <errorCode>101</errorCode>
            <errorMessage>msg-101</errorMessage>
        </Error>
    </Table>
    <Table name="Table2" type="B">
        <Error category="Fatal">
            <errorCode>102</errorCode>
            <errorMessage>msg-102</errorMessage>
        </Error>
        <Error category="Major">
            <errorCode>105</errorCode>
            <errorMessage>msg-101</errorMessage>
        </Error>    
    </Table>
</ErrorList>

下面的 XSL 代码检索具有类别属性 Fatal 或 Minor 的错误节点:

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
    <xsl:output indent="yes" />

    <xsl:template match="Error[@category = 'Fatal'] | Error[@category = 'Minor']">
        <xsl:copy-of select="self::node()"/>
    </xsl:template>
 <xsl:template match="text()"/>
</xsl:stylesheet>

我得到的输出:

<Error category="Minor">
        <errorCode>100</errorCode>
        <errorMessage>msg-100</errorMessage>
    </Error><Error category="Fatal">
        <errorCode>102</errorCode>
        <errorMessage>msg-102</errorMessage>
    </Error>

预期的输出如下(需要为选择的子节点检索父表节点):

   <Table name="Table1" type="A">
        <Error category="Minor">
            <errorCode>100</errorCode>
            <errorMessage>msg-100</errorMessage>
        </Error>
    </Table>
    <Table name="Table2" type="B">
        <Error category="Fatal">
            <errorCode>102</errorCode>
            <errorMessage>msg-102</errorMessage>
        </Error>
    </Table>

能否请您帮我处理 xsl 以获得所需的输出。

【问题讨论】:

    标签: xml xslt xpath parent-child xslt-1.0


    【解决方案1】:

    这是一个生成所需结果的样式表:

    <xsl:template match="Error[@category = 'Fatal'] | Error[@category = 'Minor']">
        <xsl:copy-of select="self::node()"/>
    </xsl:template>
    
    <xsl:template match="Table">
        <Table>
            <xsl:attribute name="name"><xsl:value-of select="@name"/></xsl:attribute>
            <xsl:attribute name="type"><xsl:value-of select="@type"/></xsl:attribute>
            <xsl:apply-templates/>
        </Table>
    </xsl:template>
    
    <xsl:template match="text()"/>
    

    【讨论】:

    • 完美运行。非常感谢!
    • 是否有理由重构结果中的节点而不是使用&lt;xsl:copy-of select="@name"/&gt;&lt;xsl:copy-of select="@type"/&gt;?或者&lt;xsl:copy-of select="."/&gt; 用于错误元素?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多