XSLT:如何选择有条件的兄弟姐妹

时间:2018-11-15 16:11:54

标签: xml xslt

我有以下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>

我希望这很清楚。

1 个答案:

答案 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>&#10;</xsl:text>
    </xsl:if>

</xsl:template>