可以通过给XML源文件中的元素设置唯一的ID属性值,然后通过XSLT来进行定位.主要用到的是id()这个函数.
该函数可以通过传入一个参数来指定对应ID的值,也可以传入可选的第二参数来制定对应的源数据.
如:id('a',$source) 表示的在$source XML数据源中寻找对应的ID属性值为'a'的元素.
可以通过三种方式为XML数据源设置对应的元素ID.
A.对于内嵌DTD的XML数据源,可以在DTD中指定元素的某个属性为ID类型.
B.可以设置元素的xml:id属性
C.对于通过XSD来校验有效性的XML数据源,可以在XSD-Schema文件中指定某个元素的类型为xs:ID类型.
现使用的XSLT解析器是:Saxon-HE版本.可能是解析器问题,第三种方式尝试了总实现不了.
以下就A B两种方式给出示例.
A.对于内嵌DTD的XML数据源,可以在DTD中指定元素的某个属性为ID类型.
数据源:test-A.xml
<?xml version="1.0" encoding="GB2312" standalone="yes"?>
<!DOCTYPE test [
<!ELEMENT test (value*)>
<!ELEMENT value (#PCDATA)>
<!ATTLIST value id ID #REQUIRED><!-- DTD中声明在test元素中存在名为id的属性值,并且该类型为ID -->
<!ATTLIST test id ID #REQUIRED><!-- DTD中声明在value元素中存在名为id的属性值,并且该类型为ID -->
]>
<test id="test">
<value id="value1">1</value>
<value id="value2">2</value>
<value id="value3">3</value>
<value id="value4">4</value>
<value id="value5">5</value>
<value id="value6">6</value>
</test>
XSLT文件:test-A.xslt
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<xsl:stylesheet version="2.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output indent="yes"/>
<xsl:template match="/">
<xsl:copy-of select="id('value2')"/>
</xsl:template>
</xsl:stylesheet>
执行后结果为:
<?xml version="1.0" encoding="UTF-8"?>
<value id="value2">2</value>
B.可以设置元素的xml:id属性
数据源:test-B.xml
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<?xml-stylesheet href="test.xslt" type="text/xsl"?>
<test xml:id="test" xmlns="http://www.ricky.com/test">
<value xml:id="value1">1</value>
<value xml:id="value2">2</value>
<value xml:id="value3">3</value>
<value xml:id="value4">4</value>
<value xml:id="value5">5</value>
<value xml:id="value6">6</value>
</test>
XSLT文件:test-B.xslt
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<xsl:stylesheet version="2.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output indent="yes"/>
<xsl:template match="/">
<xsl:copy-of select="id('value5')"/>
</xsl:template>
</xsl:stylesheet>
执行后结果
<?xml version="1.0" encoding="UTF-8"?>
<value xmlns="http://www.ricky.com/test" xml:id="value5">5</value>