如何获取HTML元素值,它是另一个HTML元素的属性值?

时间:2019-04-25 08:06:05

标签: xpath xpath-2.0 domxpath

我正在提取HTML元素属性的值。但是该属性本身包含另一个HTML元素。所以有什么我可以从该属性中提取HTML元素值吗?

这是元素

<div data-content="<i>10%</i><b>C</b>"></div>

我正在尝试获取<b>C</b>内部的价值,即C

我尝试了以下xpath:

//div/@data-content

反正请帮忙。

2 个答案:

答案 0 :(得分:0)

您在XML中输入错误。我认为应该是这样:

  <div data-content="<i>10%</i><b>C</b>"></div>>

如果是这样,请尝试以下操作,看看是否能将您带到那里:

substring-after((//div/@data-content),'<b>')

答案 1 :(得分:0)

正如已经指出的那样,您的输入示例不是格式正确的XML,因此使用XML解析器解析XML输入的标准XPath或XSLT处理链将无法正常工作。

但是,某些XSLT或XPath处理器允许您将HTML解析器而不是XML解析器插入处理链,这样您就可以解析初始输入和属性值以使用XPath。

此外,通过XSLT 2和3,您可以使用在任何XSLT 2或更高版本的样式表中以纯XSLT 2 https://github.com/davidcarlisle/web-xslt/blob/master/htmlparse/htmlparse.xsl完成的David Carlisle的HTML解析器实现,将您拥有的HTML解析为字符串,因此可以作为字符串参数,或者在XML输入的CDATA部分中转义,或者使用unparsed-text读取。

使用该HTML解析器的功能,您可以调用其htmlparse函数两次,并选择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>

在线演示

如果您对PHP及其XPath 1.0支持有所了解,那么您至少可以对通过loadHTML从HTML字符串创建的DOMDocument运行由PHP函数扩展的XPath 1.0:

$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.phphttps://www.php.net/manual/en/domdocumentfragment.appendxml.phphttps://www.php.net/manual/en/domxpath.registerphpfunctions.php