通过其多个子节点的值选择单个XML节点

时间:2013-09-29 22:30:47

标签: xml xslt select xmlnode

我想通过存在2个子节点的值来选择节点,例如给我一个节点,其对象类型节点的值为5,对于objectid节点的值为2。

objectid和objecttype组合是唯一的,因此它将始终返回单个结果。

XSL语句是什么?

<response>
    <result name="response" numFound="5" start="0">
        <doc>
            <str name="title">Tours</str>
            <int name="objecttype">5</int>
            <str name="friendlyurl">tours</str>
            <str name="avatar">2_156_DSC01511.JPG</str>
            <int name="objectid">2</int>
        </doc>
        <doc>
            <str name="title">Celebrations Car</str>
            <int name="objecttype">5</int>
            <str name="friendlyurl">celebrations-car</str>
            <str name="avatar">3_583_0509-0257-20x30-framed.jpg</str>
            <int name="objectid">3</int>
        </doc>
    </result>
</response>

2 个答案:

答案 0 :(得分:3)

考虑您在$id$type中拥有搜索条件。

如果你有一个小文件:

/response/result/doc[int[@name='objectid']=$id and int[@name='objecttype']=$type]

如果您有数千个<doc>元素:

<xsl:key name="lookup" match="doc"
         use="concat(int[@name='objectid'],'&#xd;',int[@name='objecttype'])"/>

...

  select="key('lookup',concat($id,'&#xd;',$type))"

这些在XSLT 1.0和XSLT 2.0中都有效。

答案 1 :(得分:1)

我假设您要根据其子节点选择doc节点?如果是这样,给定上面的xml示例,你必须创建一个xpath,它根据两个谓词选择doc(每个谓词都有自己的谓词。它可能看起来像这样:

<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:fn="http://www.w3.org/2005/xpath-functions">
    <xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>

    <xsl:template match="/">

        <xsl:copy-of select="response/result/doc[int[@name='objecttype'] = '5' and int[@name='objectid'] = '2']" />

    </xsl:template>

</xsl:stylesheet>

我在本地测试了这个,输出是:

<doc>
    <str name="title">Tours</str>
    <int name="objecttype">5</int>
    <str name="friendlyurl">tours</str>
    <str name="avatar">2_156_DSC01511.JPG</str>
    <int name="objectid">2</int>
</doc>