xslt xpath 在 xpath 查询中查找节点的所有元素值
xslt xpath finding all element values of a node in xpath query
这个问题与这个问题相关 但是,xslt 仅适用于两个元素节点具有分类级别并用作。
请查找以下 xmls:
<root>
<html>
<table class=" table search-results-property-table">
....
<tr>
<td>
<span class="versal">HAS TAXONOMIC LEVEL</span>
</td>
<td>
<ul>
<li>
<a class="versal" href="../../../agrovoc/en/page/c_11125">genus</a>
</li>
</ul>
</td>
</tr>
<tr>
<td>
<span class="versal">IS USED AS</span>
</td>
<td>
<ul>
<li>
<a class="versal" href="../../../agrovoc/en/page/c_1591">christmas trees</a>
</li>
<li>
<a class="versal" href="../../../agrovoc/en/page/c_7776">timber trees</a>
</li>
</ul>
</td>
</tr>
....
<table>
</html>
<html>
.....
<tr>
<td>
<span class="versal">ANOTHER HEADING LABEL</span>
</td>
<td>
<ul>
<li>
<p>values</p>
</li>
</ul>
</td>
</tr>
....
</html>
<html>
[third data set...]
...
</html>
<root>
我想在 xpath 中使用 /tr/td/span[@class='versal] 中的元素值 HAS TAXONOMIC LEVEL、IS USED AS 和其他 LABELS。接下来是输出它们的值(例如HAS TAXONOMIC LEVEL),然后得到HAS TAXONOMIC LEVEL下的后代"a"或"p" of sibling "td" /ul/li/a -> genus的值和圣诞树和木材树在 IS USED AS 下。最后,获取@href(如果可用)。所以我得到以下信息:
START HERE
=LDR 00000nam 2200000Ia 4500
....
=305 \$aHAS TAXONOMIC LEVEL$bgenus$cc_11125
=305 \$aIS USED AS$bchrismas trees$cc_1591
=305 \$aIS USED AS$btimber trees$cc_7776
START HERE
=LDR 00000nam 2200000Ia 4500
....
=305 \$aLABEL$bvalue
START HERE
=LDR 00000nam 2200000Ia 4500
(third data set and so on..)
请注意我在这个文件中有多个文档 xml 格式如下:
<root>
<html>
[DATA SET 1]
....
</html>
<html>
[DATA SET 2]
....
</html>
.....
</root>
我有以下现有的 xslt 适合它:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="text" omit-xml-declaration="yes" indent="no"/>
<xsl:template match="root">
<xsl:for-each select="html">
<xsl:text>START HERE</xsl:text>
<xsl:text> </xsl:text>
<xsl:text>=LDR 00000nam 2200000Ia 4500</xsl:text>
<xsl:text> </xsl:text>
<xsl:apply-templates select="table/prefterm" />
<xsl:text> </xsl:text>
<xsl:apply-templates select="table/tr/td/span" />
<xsl:text> </xsl:text>
....
</xsl:stylesheet>
感谢和欢呼!
更新 2:
下面的 xslt:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="text" omit-xml-declaration="yes" indent="no"/>
<xsl:template match="root">
<xsl:for-each select="html">
<xsl:text>START HERE</xsl:text>
<xsl:text> </xsl:text>
<xsl:text>=LDR 00000nam 2200000Ia 4500</xsl:text>
<xsl:text> </xsl:text>
<xsl:apply-templates select="table/prefterm" />
<xsl:text> </xsl:text>
<xsl:apply-templates select="table/tr/td/span" />
<xsl:text> </xsl:text>
<xsl:apply-templates select="table/tr"/>
<xsl:text> </xsl:text>
.......
<xsl:template match="table/tr">
<xsl:for-each select="../tr[td/span/@class='versal']">
<xsl:variable name="span" select="td/span" />
<xsl:for-each select="td/ul/li/a">
<xsl:text>=305 \$a</xsl:text>
<xsl:value-of select="$span"/>
<xsl:text>$c</xsl:text>
<xsl:value-of select="."/>
<xsl:text> </xsl:text>
</xsl:for-each>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>
使用这个模板,我得到了很多重复多次的值,这些值似乎是基于另一个节点的数量,如下所示:
START HERE
=LDR 00000nam 2200000Ia 4500
.....
=305 \$aHAS TAXONOMIC LEVEL$cgenus
=305 \$aIS USED AS$cchristmas trees
=305 \$aIS USED AS$ctimber trees
=305 \$aHAS TAXONOMIC LEVEL$cgenus
=305 \$aIS USED AS$cchristmas trees
=305 \$aIS USED AS$ctimber trees
START HERE
=LDR 00000nam 2200000Ia 4500
..... set 2 and also =305 is printed many times
在上一个问题中,表达式 give 是 this....
<xsl:for-each select="html/table/tr[td/span='HAS TAXONOMIC LEVEL' or td/span='IS USED AS']">
如果您想包括其他值,请将其更改为...
<xsl:for-each select="html/table/tr[td/span/@class='versal']">
不过,从您的输出来看,您似乎想要为每个 html
元素创建一个新部分,因此可以将代码放入匹配 html
的模板中。像这样...
<xsl:template match="html">
<xsl:text>START HERE</xsl:text>
<xsl:for-each select="table/tr[td/span/@class='versal']">
<!-- Existing code -->
</xsl:for-each>
</xsl:template>
编辑:要使其适合您的(第二个)XSLT,请改为尝试此操作
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="text" omit-xml-declaration="yes" indent="no"/>
<xsl:template match="root">
<xsl:for-each select="html">
<xsl:text>START HERE</xsl:text>
<xsl:text> </xsl:text>
<xsl:text>=LDR 00000nam 2200000Ia 4500</xsl:text>
<xsl:text> </xsl:text>
<xsl:for-each select="table/tr[td/span/@class='versal']">
<xsl:variable name="span" select="td/span" />
<xsl:for-each select="td/ul/li/a">
<xsl:text>=305 \$a</xsl:text>
<xsl:value-of select="$span"/>
<xsl:text>$c</xsl:text>
<xsl:value-of select="."/>
<xsl:text> </xsl:text>
</xsl:for-each>
</xsl:for-each>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>
现有 XSLT 的主要问题是您执行 <xsl:for-each select="//table/tr[td/span/@class='versal']">
,但 //table
将获取文档中的所有表格,因此您失去了上下文。您只需要 <xsl:for-each select="table/tr[td/span/@class='versal']">
这个问题与这个问题相关
请查找以下 xmls:
<root>
<html>
<table class=" table search-results-property-table">
....
<tr>
<td>
<span class="versal">HAS TAXONOMIC LEVEL</span>
</td>
<td>
<ul>
<li>
<a class="versal" href="../../../agrovoc/en/page/c_11125">genus</a>
</li>
</ul>
</td>
</tr>
<tr>
<td>
<span class="versal">IS USED AS</span>
</td>
<td>
<ul>
<li>
<a class="versal" href="../../../agrovoc/en/page/c_1591">christmas trees</a>
</li>
<li>
<a class="versal" href="../../../agrovoc/en/page/c_7776">timber trees</a>
</li>
</ul>
</td>
</tr>
....
<table>
</html>
<html>
.....
<tr>
<td>
<span class="versal">ANOTHER HEADING LABEL</span>
</td>
<td>
<ul>
<li>
<p>values</p>
</li>
</ul>
</td>
</tr>
....
</html>
<html>
[third data set...]
...
</html>
<root>
我想在 xpath 中使用 /tr/td/span[@class='versal] 中的元素值 HAS TAXONOMIC LEVEL、IS USED AS 和其他 LABELS。接下来是输出它们的值(例如HAS TAXONOMIC LEVEL),然后得到HAS TAXONOMIC LEVEL下的后代"a"或"p" of sibling "td" /ul/li/a -> genus的值和圣诞树和木材树在 IS USED AS 下。最后,获取@href(如果可用)。所以我得到以下信息:
START HERE
=LDR 00000nam 2200000Ia 4500
....
=305 \$aHAS TAXONOMIC LEVEL$bgenus$cc_11125
=305 \$aIS USED AS$bchrismas trees$cc_1591
=305 \$aIS USED AS$btimber trees$cc_7776
START HERE
=LDR 00000nam 2200000Ia 4500
....
=305 \$aLABEL$bvalue
START HERE
=LDR 00000nam 2200000Ia 4500
(third data set and so on..)
请注意我在这个文件中有多个文档 xml 格式如下:
<root>
<html>
[DATA SET 1]
....
</html>
<html>
[DATA SET 2]
....
</html>
.....
</root>
我有以下现有的 xslt 适合它:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="text" omit-xml-declaration="yes" indent="no"/>
<xsl:template match="root">
<xsl:for-each select="html">
<xsl:text>START HERE</xsl:text>
<xsl:text> </xsl:text>
<xsl:text>=LDR 00000nam 2200000Ia 4500</xsl:text>
<xsl:text> </xsl:text>
<xsl:apply-templates select="table/prefterm" />
<xsl:text> </xsl:text>
<xsl:apply-templates select="table/tr/td/span" />
<xsl:text> </xsl:text>
....
</xsl:stylesheet>
感谢和欢呼!
更新 2: 下面的 xslt:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="text" omit-xml-declaration="yes" indent="no"/>
<xsl:template match="root">
<xsl:for-each select="html">
<xsl:text>START HERE</xsl:text>
<xsl:text> </xsl:text>
<xsl:text>=LDR 00000nam 2200000Ia 4500</xsl:text>
<xsl:text> </xsl:text>
<xsl:apply-templates select="table/prefterm" />
<xsl:text> </xsl:text>
<xsl:apply-templates select="table/tr/td/span" />
<xsl:text> </xsl:text>
<xsl:apply-templates select="table/tr"/>
<xsl:text> </xsl:text>
.......
<xsl:template match="table/tr">
<xsl:for-each select="../tr[td/span/@class='versal']">
<xsl:variable name="span" select="td/span" />
<xsl:for-each select="td/ul/li/a">
<xsl:text>=305 \$a</xsl:text>
<xsl:value-of select="$span"/>
<xsl:text>$c</xsl:text>
<xsl:value-of select="."/>
<xsl:text> </xsl:text>
</xsl:for-each>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>
使用这个模板,我得到了很多重复多次的值,这些值似乎是基于另一个节点的数量,如下所示:
START HERE
=LDR 00000nam 2200000Ia 4500
.....
=305 \$aHAS TAXONOMIC LEVEL$cgenus
=305 \$aIS USED AS$cchristmas trees
=305 \$aIS USED AS$ctimber trees
=305 \$aHAS TAXONOMIC LEVEL$cgenus
=305 \$aIS USED AS$cchristmas trees
=305 \$aIS USED AS$ctimber trees
START HERE
=LDR 00000nam 2200000Ia 4500
..... set 2 and also =305 is printed many times
在上一个问题中,表达式 give 是 this....
<xsl:for-each select="html/table/tr[td/span='HAS TAXONOMIC LEVEL' or td/span='IS USED AS']">
如果您想包括其他值,请将其更改为...
<xsl:for-each select="html/table/tr[td/span/@class='versal']">
不过,从您的输出来看,您似乎想要为每个 html
元素创建一个新部分,因此可以将代码放入匹配 html
的模板中。像这样...
<xsl:template match="html">
<xsl:text>START HERE</xsl:text>
<xsl:for-each select="table/tr[td/span/@class='versal']">
<!-- Existing code -->
</xsl:for-each>
</xsl:template>
编辑:要使其适合您的(第二个)XSLT,请改为尝试此操作
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="text" omit-xml-declaration="yes" indent="no"/>
<xsl:template match="root">
<xsl:for-each select="html">
<xsl:text>START HERE</xsl:text>
<xsl:text> </xsl:text>
<xsl:text>=LDR 00000nam 2200000Ia 4500</xsl:text>
<xsl:text> </xsl:text>
<xsl:for-each select="table/tr[td/span/@class='versal']">
<xsl:variable name="span" select="td/span" />
<xsl:for-each select="td/ul/li/a">
<xsl:text>=305 \$a</xsl:text>
<xsl:value-of select="$span"/>
<xsl:text>$c</xsl:text>
<xsl:value-of select="."/>
<xsl:text> </xsl:text>
</xsl:for-each>
</xsl:for-each>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>
现有 XSLT 的主要问题是您执行 <xsl:for-each select="//table/tr[td/span/@class='versal']">
,但 //table
将获取文档中的所有表格,因此您失去了上下文。您只需要 <xsl:for-each select="table/tr[td/span/@class='versal']">