我有一个附有ID的XML文档,例如:
<Section>
<Field Id="1">... content ...</Field>
<Field Id="2">... content ...</Field>
<Section>
<Field Id="5">... content ...</Field>
<Field Id="6">... content ...</Field>
<Section>
<Field Id="10">... content ...</Field>
<Field Id="20">... content ...</Field>
...
</Section>
...
</Section>
...
</Section>
实际文档有许多嵌套的部分和字段。是否使用XPath表达式搜索特定的Id,例如:
//Field[@Id=$vSearchId]
可能是一项昂贵的操作? $vSearchId
此处表示持有Id搜索的XSL样式表中的变量。
是否有更有效的方法来执行此类查找,例如构建索引?我查看了xsl:key
,但我不确定如何使用它来搜索整个文档。
答案 0 :(得分:2)
我看了
xsl:key
,但我不确定如何使用它进行搜索 在整个文档中。
喜欢这个吗?
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
<xsl:key name="fld" match="Field" use="@Id" />
<xsl:variable name="vSearchId">6</xsl:variable>
<xsl:template match="/">
<xsl:copy-of select="key('fld', $vSearchId)"/>
</xsl:template>
</xsl:stylesheet>
答案 1 :(得分:1)
您可以定义一个键:
<xsl:key name="id-register" match="Field" use="@Id"/>
之后,您可以使用此密钥处理具有特定ID的<Field>
的出现次数:
<xsl:for-each select="key('id-register','10')">
<!-- Do Stuff -->
</xsl:for-each>
答案 2 :(得分:1)
是否使用XPath表达式搜索特定的ID,例如:
//Field[@Id=$vSearchId]
可能很贵?
是的,它可能很贵。但只有潜力。对于许多处理器,定义xsl:key
并使用key()
函数将加快此查询(通过创建索引)。但像Saxon-EE这样的具有智能优化器的处理器将自动构建索引,而无需您明确要求它。