我有以下XML:
<?xml version="1.0" encoding="UTF-8"?>
<thesaurus xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<term id="01">
<name>
<value>green</value>
</name>
<info>
<ref rid="12" obj-type="Building" />
</info>
<info>
<ref rid="13" obj-type="House" />
</info>
<info>
<ref rid="14" obj-type="Apartment"/>
</info>
</term>
<term id="02">
<name>
<value>blue</value>
</name>
<info>
<ref rid="24" obj-type="Unknown"/>
</info>
<info>
<ref rid="26" obj-type="Unknown"/>
</info>
<info>
<ref rid="29" obj-type="Unknown"/>
</info>
</term>
<term id="03">
<name>
<value>yellow</value>
</name>
</term>
<term id="04">
<name>
<value>red</value>
</name>
<info>
<ref rid="40" obj-type="Hotel"/>
</info>
<info>
<ref rid="41" obj-type="Building"/>
</info>
<info>
<ref rid="43" obj-type="House"/>
</info>
</term>
<term id="05">
<name>
<value>purple</value>
</name>
</term>
<term id="06">
<name>
<value>magenta</value>
</name>
<info>
<ref rid="60" obj-type="Building"/>
</info>
<info>
<ref rid="62" obj-type="Unknown"/>
</info>
<info>
<ref rid="64" obj-type="House"/>
</info>
</term>
</thesaurus>
我想要的是这个
1)选择所有没有
<term>
标签的<info>
标签。这是 第一个apply模板已经完成了: 下面的XSLT中的 select =“ term [not(info)]” 。2)当
<term>
标签包含一个{<ref>
单独或多次,但如果 它被obj-type="Unknown"
包围,其值不同于“ 未知” (如建筑物或房屋)。***在
obj-types
标记内,当<info>
的兄弟姐妹具有其他值时,obj-type
标签至少需要一个'Unknown'值 被选中。
如果XSLT运作良好,则所选标签将为:
02、03、05
其中:
01将不会被选中,因为它包含
选择<term>
标签,并且这些标签都没有obj-type ='Unknown'02是因为存在三个“ Unknown”(未知)值,并且 除“未知”外没有其他值
03将被选中,因为它不包含
<info>
标记04将不会被选择,因为它包含
<info>
个值与“ {Unknown”不同的<info>
标记。05将被选中,因为没有信息标签。
06不会被选择,因为尽管其中一个值为“未知”, 所有其他
obj-type
兄弟姐妹的值<ref>
与“未知”不同。***记住:在
obj-type
标记内,当<info>
的兄弟姐妹具有其他值时,它至少需要一个值 未选中obj-type
标签的标签为“未知”。
我正在使用下面的XSLT。使用第一个应用模板,我可以选择没有<term>
标签的所有标签。
有了第二个应用模板,我可以选择所有包含<info>
标签和<term>
标签的<ref>
标签,但我不知道如何告诉XSLT如果存在具有不同值的obj类型,请不要选择相应的obj-type="Unknown"
标记。
我尝试使用for-each和有条件的方法来遍历所有<term>
的孩子,并检查其中一个兄弟姐妹的值是否不同于'Unknown'而不选择其<ref>
父母,但无济于事。
<term>
我希望这很清楚。
答案 0 :(得分:1)
您可以尝试选择不含Unknown
<xsl:apply-templates select="term[not(info/ref[@obj-type!='Unknown'])]"/>
或在您的term[info/ref]
模板中添加if语句
<xsl:template match="term[info/ref]">
<xsl:if test="not(info/ref[@obj-type!='Unknown'])">
<xsl:value-of select="@id"/>
<xsl:text>,</xsl:text>
<xsl:value-of select="name"/>
<xsl:text>,</xsl:text>
<xsl:text> </xsl:text>
</xsl:if>
</xsl:template>