C# XSLT通过只过滤标记值等于的节点来创建另一个XML

C# XSLT通过只过滤标记值等于的节点来创建另一个XML,c#,xml,xslt,tags,filtering,C#,Xml,Xslt,Tags,Filtering,我想在XSLT的帮助下从下面的文档示例创建另一个XML。这个想法是把所有学生带到他们的个人资料>城市[PNH]的地方,不管他们的来源>地址>城市是什么。我知道,在XSLT的帮助下,我们可以过滤掉并只复制我们希望在新XML文档中包含的内容 <?xml version="1.0" encoding="utf-8"?> <Class> <Student> <Profile>

我想在XSLT的帮助下从下面的文档示例创建另一个XML。这个想法是把所有学生带到他们的个人资料>城市[PNH]的地方,不管他们的来源>地址>城市是什么。我知道,在XSLT的帮助下,我们可以过滤掉并只复制我们希望在新XML文档中包含的内容

<?xml version="1.0" encoding="utf-8"?>
<Class>    
    <Student>
        <Profile>
            <Name>G1</Name>
            <City>PNH</City>            
            <RegDate>2020-06-20</RegDate>
        </Profile>
        <Origin>
            <Address>
                <City>REP</City>
            </Address> 
        </Origin>
    </Student>
    <Student>
        <Profile>
            <Name>G4</Name>
            <City>REP</City>            
            <RegDate>2020-06-20</RegDate>
        </Profile>
        <Origin>
            <Address>
                <City>PNH</City>
            </Address> 
        </Origin>
    </Student>    
    <Student>
        <Profile>
            <Name>G3</Name>
            <City>PNH</City>            
            <RegDate>2020-06-20</RegDate>
        </Profile>
        <Origin>
            <Address>
                <City>PNH</City>
            </Address> 
        </Origin>
    </Student>
    <Student>
        <Profile>
            <Name>G5</Name>
            <City>KOS</City>            
            <RegDate>2020-06-20</RegDate>
        </Profile>
        <Origin>
            <Address>
                <City>PNH</City>
            </Address> 
        </Origin>
    </Student>
</Class>

G1
PNH
2020-06-20
代表
G4
代表
2020-06-20
PNH
G3
PNH
2020-06-20
PNH
G5
科斯
2020-06-20
PNH
我只想选择那些Profile->City等于“PNH”的学生,这是最终的XML结果

<?xml version="1.0" encoding="utf-8"?>
<Class>    
    <Student>
        <Profile>
            <Name>G1</Name>
            <City>PNH</City>            
            <RegisterDate>2020-06-20</RegisterDate>
        </Profile>
        <Origin>
            <Address>
                <City>REP</City>
            </Address> 
        </Origin>
    </Student>   
    <Student>
        <Profile>
            <Name>G3</Name>
            <City>PNH</City>            
            <RegisterDate>2020-06-20</RegisterDate>
        </Profile>
        <Origin>
            <Address>
                <City>PNH</City>
            </Address> 
        </Origin>
    </Student>
</Class>

G1
PNH
2020-06-20
代表
G3
PNH
2020-06-20
PNH
我已经试过了,但它仍然得到了所有学生,但删除了城市不是PNH的个人资料标签中的数据

<xsl:template match="@*|node()">
  <xsl:copy>
   <xsl:apply-templates select="@*|node()"/>
  </xsl:copy>
 </xsl:template>
 <xsl:template match="Profile[not(City = 'PNH')]"/>

如果要排除满足条件的
学生,则模板必须与
学生
元素匹配:

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
<xsl:strip-space elements="*"/>

<!-- identity transform -->
<xsl:template match="@*|node()">
    <xsl:copy>
        <xsl:apply-templates select="@*|node()"/>
    </xsl:copy>
</xsl:template>

<xsl:template match="Student[not(Profile/City = 'PNH')]"/>

</xsl:stylesheet>

或者,您可以简单地执行以下操作:

<xsl:stylesheet version="1.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="/Class">
    <xsl:copy>
        <xsl:copy-of select="Student[Profile/City = 'PNH']"/>
    </xsl:copy>
</xsl:template>

</xsl:stylesheet>


太好了,它现在正在工作。将属性xsi:nil=“true”添加到标记时还有一个问题。C#在初始加载文档时,引发新XPathDocument(sXmlPath)上未定义前缀“xsi”的错误捕获。我想我应该再写一篇文章,我也这么认为。