【发布时间】:2018-11-15 16:11:53
【问题描述】:
我有以下 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) 选择所有没有
<info>标签的<term>标签。这是 已经使用第一个应用模板完成: select="term[not(info)]" 在下面的 XSLT 中。2) 当
<ref>标签包含一个<term>标签时,选择所有标签obj-type="Unknown"单独或多次,但如果 它被obj-types包围,其值不同于“Unknown” (如建筑物或房屋)。*** 在
<info>标记内,当obj-type兄弟姐妹具有其他值时,<term>标签至少需要一个“未知”值 被选中。
如果 XSLT 运行良好,选择的标签将是:
02、03、05
地点:
01 不会被选中,因为它包含
<info>标签,并且这些标签都没有 obj-type='Unknown'02 将被选中,因为 'Unknown' 存在三个多重值,并且 没有与“未知”不同的其他值
03 将被选中,因为它不包含
<info>标签04 将不会被选中,因为它包含
<info>标记,其obj-type值不同于“未知”。05 将被选中,因为没有信息标签。
06 不会被选中,因为虽然只有一个值 'Unknown', 所有其他
<ref>兄弟姐妹的值obj-type不同于“未知”。*** 记住:在
<info>标记内,当obj-type有其他值的兄弟姐妹时,它至少需要一个值 'Unknown' 表示<term>标签不会被选中。
我正在使用下面的 XSLT。使用第一个 apply-templates 我可以选择所有没有<info> 标签的标签。
使用第二个apply-templates,我可以选择所有包含<ref> 标记和obj-type="Unknown" 的<term> 标记,但我不知道如何告诉XSLT如果有不同值的obj-types,不要选择对应的<term>标签。
我尝试使用 for-each 和条件来遍历所有 <ref> 子代,并检查其中一个兄弟姐妹的值是否不同于“未知”以不选择其 <term> 父代,而是没用。
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" >
<xsl:output method="text"/>
<xsl:template match="/thesaurus">
<xsl:apply-templates select="term[not(info)]"/>
<xsl:apply-templates select="term[info/ref[@obj-type='Unknown']]"/>
</xsl:template>
<xsl:template match="term">
<xsl:value-of select="@id"/>
<xsl:text>,</xsl:text>
<xsl:value-of select="name"/>
<xsl:text>,</xsl:text>
<xsl:text> </xsl:text>
</xsl:template>
<xsl:template match="term[info/ref]">
<xsl:value-of select="@id"/>
<xsl:text>,</xsl:text>
<xsl:value-of select="name"/>
<xsl:text>,</xsl:text>
<xsl:text> </xsl:text>
</xsl:template>
</xsl:stylesheet>
我希望它很清楚。
【问题讨论】: