我正在尝试获取一个大型XML文件,并从中仅提取一些标记元素。我以为我使用模板匹配标签进入我想要的子类(subClass不是正确的单词,但我是从RDF / OWL的角度来看这个),但它似乎没有过滤掉那些不在那个子类中的东西。这是代码:
XML:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<ns4:getCollectiveTaskResponse
xmlns:ns1="http://sample.com/xsd/task/1.0"
xmlns:ns2="http://sample.com/xsd/commonElements/1.0" xmlns:ns3="http://sample.com/xsd/individualTask/1.0" xmlns:ns4="http://sample.com/xsd/collectiveTask/1.0"
xmlns:ns5="http://sample.com/xsd/handle"
xmlns:ns6="http://sample.com/appinfo/1">
<ns4:collectiveTask>
<ns4:generalInformation>
<number>13</number>
<title>Quarterback</title>
<name>Dan Marino</name>
</ns4:generalInformation>
<junk>I don't want this</junk>
</ns4:collectiveTask>
<junk>I don't want this either</junk>
</ns4:getCollectiveTaskResponse>
XSL:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0"
xmlns:ns1="http://sample.com/xsd/task/1.0"
xmlns:ns2="http://sample.com/xsd/commonElements/1.0" xmlns:ns3="http://sample.com/xsd/individualTask/1.0" xmlns:ns4="http://sample.com/xsd/collectiveTask/1.0"
xmlns:ns5="http://sample.com/xsd/handle"
xmlns:ns6="http://sample.com/appinfo/1">
<xsl:template match="/ns4:getCollectiveTaskResponse/ns4:collectiveTask/ns4:generalInformation" >
Number:<xsl:value-of select="number"/>
Title:<xsl:value-of select="title"/>
Name:<xsl:value-of select="name"/>
</xsl:template>
</xsl:stylesheet>
答案 0 :(得分:2)
您没有匹配/
的模板,因此XSLT的built-in template rules会启动。这些将有效地匹配节点,然后为子节点选择模板。因此,最终将选择您的junk
节点,然后内置模板将输出文件节点,并将其归档。
有很多方法可以解决您的特定问题。您可以添加模板以忽略junk
个节点...
<xsl:template match="junk" />
或者,如果您有许多此类节点,则可以添加模板以忽略所有文本节点
<xsl:template match="text()" />
或者您可以为/
添加模板匹配,然后明确选择您想要的节点....
<xsl:template match="/">
<xsl:apply-templates select="ns4:getCollectiveTaskResponse/ns4:collectiveTask/ns4:generalInformation" />
</xsl:template>
<xsl:template match="ns4:generalInformation">
Number:<xsl:value-of select="number"/>
Title:<xsl:value-of select="title"/>
Name:<xsl:value-of select="name"/>
</xsl:template>