C# XSLT通过只过滤标记值等于的节点来创建另一个XML
我想在XSLT的帮助下从下面的文档示例创建另一个XML。这个想法是把所有学生带到他们的个人资料>城市[PNH]的地方,不管他们的来源>地址>城市是什么。我知道,在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>
<?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”的错误捕获。我想我应该再写一篇文章,我也这么认为。