如何获取 HTML 元素值,它是另一个 HTML 元素的属性值?
How to get HTML element value which is a attribute value of another HTML element?
我正在提取 HTML 元素属性的值。但是该属性本身包含另一个 HTML 元素。那么我是否可以从该属性中提取 HTML 元素值?
这是元素
<div data-content="<i>10%</i><b>C</b>"></div>
我正在尝试获取 <b>C</b>
内的值,即 C
我试过下面的 xpath:
//div/@data-content
无论如何请帮忙。
您的 XML 中有错字。我认为它应该是:
<div data-content="<i>10%</i><b>C</b>"></div>>
如果是这样,试试这个,看看它是否能帮助你:
substring-after((//div/@data-content),'<b>')
正如已经指出的那样,您的输入样本格式不正确 XML 因此标准 XPath 或 XSLT 处理链使用 XML 解析器来解析 XML 输入无效。
但是,某些 XSLT 或 XPath 处理器允许您将 HTML 解析器而不是 XML 解析器插入处理链,这样您就可以解析初始输入和属性值以及使用 XPath。
此外,对于 XSLT 2 和 3,您可以使用来自任何 XSLT 2 或更高版本样式表的 David Carlisle 的 HTML 在纯 XSLT 2 https://github.com/davidcarlisle/web-xslt/blob/master/htmlparse/htmlparse.xsl 中完成的解析器实现来解析您拥有的 HTML作为字符串,因此要么作为字符串参数传入,要么在 XML 输入的 CDATA 部分中转义,或者使用 unparsed-text
.
读入
然后使用 HTML 解析器的功能,您可以调用其 htmlparse
函数两次,并 select b
元素,例如dpc:htmlparse($html-input, '', true())/div[@data-content]/dpc:htmlparse(@data-content, '', true())/b
或其内容,例如dpc:htmlparse($html-input, '', true())/div[@data-content]/dpc:htmlparse(@data-content, '', true())/b/string()
.
完整的 XSLT 样式表是
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:dpc="data:,dpc"
exclude-result-prefixes="#all"
version="3.0">
<xsl:import href="https://github.com/davidcarlisle/web-xslt/raw/master/htmlparse/htmlparse.xsl"/>
<xsl:param name="html-input" as="xs:string"><![CDATA[<div data-content="<i>10%</i><b>C</b>"></div>]]></xsl:param>
<xsl:template name="xsl:initial-template" match="/">
<xsl:copy-of select="dpc:htmlparse($html-input, '', true())/div[@data-content]/dpc:htmlparse(@data-content, '', true())/b/string()"/>
</xsl:template>
</xsl:stylesheet>
在线演示在
- https://xsltfiddle.liberty-development.net/6r5Gh3s/4
- https://xsltfiddle.liberty-development.net/6r5Gh3s/5
如果您依赖 PHP 及其 XPath 1.0 支持,那么您至少可以 运行 由 PHP 函数扩展的 XPath 1.0 针对使用 [ 创建的 DOMDocument =17=] 来自 HTML 字符串:
$html = <<<EOT
<div data-content="<i>10%</i><b>C</b>"></div>
EOT;
$domDoc = new DOMDocument();
$domDoc->loadHTML($html);
function parseXmlFragment($fragment) {
$docFrag = $fragment[0]->ownerDocument->createDocumentFragment();
$docFrag->appendXML($fragment[0]->textContent);
return $docFrag;
}
$xpath = new DOMXPath($domDoc);
$xpath->registerNamespace("php", "http://php.net/xpath");
$xpath->registerPHPFunctions("parseXmlFragment");
echo $xpath->evaluate("string(php:function('parseXmlFragment', //div[@data-content]/@data-content)/b)", $domDoc);
见https://www.php.net/manual/en/domdocument.loadhtml.php, https://www.php.net/manual/en/domdocumentfragment.appendxml.php and https://www.php.net/manual/en/domxpath.registerphpfunctions.php。
我正在提取 HTML 元素属性的值。但是该属性本身包含另一个 HTML 元素。那么我是否可以从该属性中提取 HTML 元素值?
这是元素
<div data-content="<i>10%</i><b>C</b>"></div>
我正在尝试获取 <b>C</b>
内的值,即 C
我试过下面的 xpath:
//div/@data-content
无论如何请帮忙。
您的 XML 中有错字。我认为它应该是:
<div data-content="<i>10%</i><b>C</b>"></div>>
如果是这样,试试这个,看看它是否能帮助你:
substring-after((//div/@data-content),'<b>')
正如已经指出的那样,您的输入样本格式不正确 XML 因此标准 XPath 或 XSLT 处理链使用 XML 解析器来解析 XML 输入无效。
但是,某些 XSLT 或 XPath 处理器允许您将 HTML 解析器而不是 XML 解析器插入处理链,这样您就可以解析初始输入和属性值以及使用 XPath。
此外,对于 XSLT 2 和 3,您可以使用来自任何 XSLT 2 或更高版本样式表的 David Carlisle 的 HTML 在纯 XSLT 2 https://github.com/davidcarlisle/web-xslt/blob/master/htmlparse/htmlparse.xsl 中完成的解析器实现来解析您拥有的 HTML作为字符串,因此要么作为字符串参数传入,要么在 XML 输入的 CDATA 部分中转义,或者使用 unparsed-text
.
然后使用 HTML 解析器的功能,您可以调用其 htmlparse
函数两次,并 select b
元素,例如dpc:htmlparse($html-input, '', true())/div[@data-content]/dpc:htmlparse(@data-content, '', true())/b
或其内容,例如dpc:htmlparse($html-input, '', true())/div[@data-content]/dpc:htmlparse(@data-content, '', true())/b/string()
.
完整的 XSLT 样式表是
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:dpc="data:,dpc"
exclude-result-prefixes="#all"
version="3.0">
<xsl:import href="https://github.com/davidcarlisle/web-xslt/raw/master/htmlparse/htmlparse.xsl"/>
<xsl:param name="html-input" as="xs:string"><![CDATA[<div data-content="<i>10%</i><b>C</b>"></div>]]></xsl:param>
<xsl:template name="xsl:initial-template" match="/">
<xsl:copy-of select="dpc:htmlparse($html-input, '', true())/div[@data-content]/dpc:htmlparse(@data-content, '', true())/b/string()"/>
</xsl:template>
</xsl:stylesheet>
在线演示在
- https://xsltfiddle.liberty-development.net/6r5Gh3s/4
- https://xsltfiddle.liberty-development.net/6r5Gh3s/5
如果您依赖 PHP 及其 XPath 1.0 支持,那么您至少可以 运行 由 PHP 函数扩展的 XPath 1.0 针对使用 [ 创建的 DOMDocument =17=] 来自 HTML 字符串:
$html = <<<EOT
<div data-content="<i>10%</i><b>C</b>"></div>
EOT;
$domDoc = new DOMDocument();
$domDoc->loadHTML($html);
function parseXmlFragment($fragment) {
$docFrag = $fragment[0]->ownerDocument->createDocumentFragment();
$docFrag->appendXML($fragment[0]->textContent);
return $docFrag;
}
$xpath = new DOMXPath($domDoc);
$xpath->registerNamespace("php", "http://php.net/xpath");
$xpath->registerPHPFunctions("parseXmlFragment");
echo $xpath->evaluate("string(php:function('parseXmlFragment', //div[@data-content]/@data-content)/b)", $domDoc);
见https://www.php.net/manual/en/domdocument.loadhtml.php, https://www.php.net/manual/en/domdocumentfragment.appendxml.php and https://www.php.net/manual/en/domxpath.registerphpfunctions.php。