Xml 如何获取父节点及其所有组件';如果条件为真,则返回子节点

Xml 如何获取父节点及其所有组件';如果条件为真,则返回子节点,xml,xslt-2.0,Xml,Xslt 2.0,我得到了以下XML <?xml version="1.0" encoding="utf-8"?> <Students> <Student> <StdId value="1"/> <Name>a</Name> <Courses> <Course value="c1"/> <Course valu

我得到了以下XML

<?xml version="1.0" encoding="utf-8"?>
<Students>
    <Student>
        <StdId value="1"/>
        <Name>a</Name>
        <Courses>
            <Course value="c1"/>
            <Course value="c2"/>
            <Course value="c3"/>
        </Courses>
    </Student>
    <Student>
        <StdId value="2" InActive="True"/>
        <Name>b</Name>
        <Courses>
            <Course value="c1"/>
            <Course value="c4"/>
            <Course value="c6"/>
        </Courses>
    </Student>
</Students>

A.
B
我的XSLT代码是

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0">
    <xsl:output method="xml" indent="yes"/>
    <xsl:strip-space elements="*"/>
    <xsl:template match="/">
        <xsl:result-document method="xml" href="file:///C:/Student_details.xml">
            <xsl:for-each select="Students/Student">
                <xsl:if test="(StdId[@InActive != 'True'])">
                    <xsl:copy-of select="Student"/>
                </xsl:if>
            </xsl:for-each>
        </xsl:result-document>
    </xsl:template>
</xsl:stylesheet>

我希望将
Student
元素及其子节点与
StdId
InActive=“True”
元素分开。我的代码不复制任何student元素

  • 如果atributte根本不存在,将找不到该节点

  • 会被发现的

    你可以用

     <xsl:if test="(StdId[@InActive!= 'True'] or StdId[not(@InActive)])">
    
    
    
    为了同时选择属性不存在的节点

  • 不起作用。 您可以使用
    选择当前节点(即学生节点的内容),或
    ,以同时获取
    <代码>标签

  • 您可以更改
    中的XPath for each
    select,以仅迭代那些没有
    InActive=“True”
    属性的对象,如下所示:

    <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0">
        <xsl:output method="xml" indent="yes"/>
        <xsl:strip-space elements="*"/>
        <xsl:template match="/">
            <xsl:result-document method="xml">
                <xsl:for-each select="Students/Student[not(StdId/@InActive)]">
                        <xsl:copy-of select="."/>
                </xsl:for-each>
            </xsl:result-document>
        </xsl:template>
    </xsl:stylesheet>
    
    <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0">
        <xsl:output method="xml" indent="yes"/>
        <xsl:strip-space elements="*"/>
        <xsl:template match="Student[not(StdId/@InActive)]">
            <xsl:copy-of select="."/>
        </xsl:template>
        <xsl:template match="/">
            <xsl:result-document method="xml">
                <root>
                    <xsl:apply-templates/>
                </root>
            </xsl:result-document>
        </xsl:template>
    </xsl:stylesheet>
    
    
    
    请注意,您的输出不是有效的XML,因为它没有根节点

    或者,您可以使用模板匹配,如下所示:

    <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0">
        <xsl:output method="xml" indent="yes"/>
        <xsl:strip-space elements="*"/>
        <xsl:template match="/">
            <xsl:result-document method="xml">
                <xsl:for-each select="Students/Student[not(StdId/@InActive)]">
                        <xsl:copy-of select="."/>
                </xsl:for-each>
            </xsl:result-document>
        </xsl:template>
    </xsl:stylesheet>
    
    <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0">
        <xsl:output method="xml" indent="yes"/>
        <xsl:strip-space elements="*"/>
        <xsl:template match="Student[not(StdId/@InActive)]">
            <xsl:copy-of select="."/>
        </xsl:template>
        <xsl:template match="/">
            <xsl:result-document method="xml">
                <root>
                    <xsl:apply-templates/>
                </root>
            </xsl:result-document>
        </xsl:template>
    </xsl:stylesheet>
    
    
    
    在我的第二个样式表中,我添加了一个根节点——用于我自己的本地测试,ymmv


    我还在我的第一个样式表中编辑了XPath,因为您在一条评论中说,该属性只有在其值为“True”时才会出现。

    该属性不存在。只有当它为真时它才存在。耶,这就是为什么我建议您使用StdId[not(@InActive)]将选择不具有该属性的节点。谢谢。如何获得根元素。如果根元素有任何不写入学生元素的内容,是否有任何方法可以忽略名称空间。还有,我如何编写根元素。@user3202862-我的第二个XSLT显示的根元素是
    root
    。我不知道您对根元素的要求是什么,但这相对简单。然而,名称空间问题可能相当复杂——最好单独提出一个问题,并包含包含名称空间的示例XML