XPath的主要目的是解决XML文档的各个部分。它还提供操纵弦乐,数字和布尔值的基本设施。 XPath使用紧凑的非XML语法。 XPath在XML文档的抽象逻辑结构上运行,而不是表面语法。
我有一个 XML 文件,正在使用 oXygen 中的 XSLT 3.0 将其转换为 HTML。 假设我的输入文件如下所示: 首先我与约翰·史密斯交谈。 然后我 我有一个 XML 文件,正在使用 oXygen 中的 XSLT 3.0 将其转换为 HTML。 假设我的输入文件如下所示: <root> <p>First I spoke to John Smith.</p> <p>Then I talked with David Jones.</p> </root> 此外,我有一个术语列表,我想在转换过程中自动标记它们。它们位于单独的 XML 文件中,如下所示: <terms> <term>spoke</term> <term>talked</term> </terms> 我希望我的输出 HTML 看起来像这样: <body> <p>First I <span class="term">spoke</span> to John Smith.</p> <p>Then I <span class="term">talked</span> with David Jones.</p> </body> 当然,这可以通过正则表达式搜索和替换来完成,但我正在将数百个术语的列表与一本书长的文本进行整理,因此一次只执行一个是不可能的。我认为在我的 XSLT 中必须有一种自动化的方法来执行此操作。 在我看来,它可能起作用的一种方式是使用类似这样的东西,除了不是单个正则表达式搜索,我需要让它循环遍历其他 XML 文件中的元素的所有: <xsl:analyze-string> 或者是否有某种方法可以从术语列表中的 xsl:for-each 开始,并将其输入到 Replace() 函数中。但我不确定如何构建它,因此它会影响 XML 书籍的文本输出。 任何方向将不胜感激。抱歉我的无知;我还在学习中。 听起来你想要<xsl:template match="text()"> <xsl:analyze-string select="." regex="findmywords"> <xsl:matching-substring> <span class="term"> <xsl:value-of select="."/> </span> </xsl:matching-substring> <xsl:non-matching-substring> <xsl:value-of select="."/> </xsl:non-matching-substring> </xsl:analyze-string> </xsl:template> 。如果任何术语可能具有会影响正则表达式匹配的特殊字符,请使用 funtx 库中的 regex="{string-join(doc('terms,xml')//term, '|')}"。
如何简化这些阻止 Google 烦恼的 Ublock 过滤器
我经常使用谷歌搜索,我真的很讨厌谷歌搜索的各种东西,比如“人们也问”和“人们也搜索”,搜索建议会下降。这些...
XSLT 3.0 分组依据 <xsl:function as="xs:boolean">:如何将结果映射到有意义的文本属性以进行输出
我想在 XSLT 3.0 中使用我自己的 作为分组键。我的函数返回 xs:boolean 但在分组的输出中我想将 true 和 false 映射到有意义的字符串值,我...
我有一个表,其中包含 XML 列 XmlMsg。此列可以包含订单状态、车辆状态、... 我只对 orderstatus 节点感兴趣,更确切地说对以下两种情况感兴趣: 那个...
我有一个表,其中包含 XML 列 XmlMsg。此 XmlMsg 可以包含“orderstatus”、“vehiclestatus”... 我只对“订单状态”感兴趣,更确切地说......
我正在使用 xpath 检索给定元素中某些链接 (a) 的文本值。然后,我将结果推送到名为 $tableau 的数组。一切正常:) 问题是,我现在想要
如何从 DOMDocument() 中的 div 中删除文本
我有一个 html 字符串,其中包含一些 div 中的文本。我需要从 div 中提取该文本。 (出于好奇,当用户复制/粘贴到可内容编辑的文件中时,这些额外的 div 就会出现......
我正在尝试了解 XML 和 XSLT 的内容,在我的研究中我偶然发现了不同的 XSLT 处理器。 Xalan 是第一个,它似乎工作得很好而且是免费的,除了......
我有一个XML文件: 莫比迪克 赫尔曼梅尔维尔 日出之夜 杰夫·曾特纳 我有一个 XML 文件: <xml> <title>Moby-Dick</title> <author>Herman Melville</author> <title>Sunrise Nights</title> <author>Jeff Zentner</author> <author>Brittany Cavallaro</author> <price>14.52€</price> <title>My Salty Mary</title> <author>Cynthia Hand</author> <author>Brodi Ashton</author> <author>Jodi Meadows</author> </xml> 我想将其转变为: <xml> <book> <title>Moby-Dick</title> <author>Herman Melville</author> </book> <book> <title>Sunrise Nights</title> <author>Jeff Zentner</author> <author>Brittany Cavallaro</author> <price>14.52€</price> </book> <book> <title>My Salty Mary</title> <author>Cynthia Hand</author> <author>Brodi Ashton</author> <author>Jodi Meadows</author> </book> </xml> 逻辑是每次遇到 book 时创建一个新的 title 并将所有后续节点放入该书中。 这是我迄今为止尝试过的: let $books := ( doc("books.xml")/xml/* => fold-left((array{}, 0), function($acc, $node) { let $arr := $acc[1], $idx := $acc[2] return if (name($node) = "title") then ($arr => array:append($node), $idx+1) else ($arr => array:put($idx, ($arr => array:get($idx), $node)), $idx) }) )[1] return <xml>{for $book in $books return <book>{$book}</book>}</xml> 但是我明白了 <xml> <book> <title>Moby-Dick</title> <author>Herman Melville</author> <title>Sunrise Nights</title> <author>Jeff Zentner</author> <author>Brittany Cavallaro</author> <price>14.52€</price> <title>My Salty Mary</title> <author>Cynthia Hand</author> <author>Brodi Ashton</author> <author>Jodi Meadows</author> </book> </xml> 旁白:group by似乎对解决当前问题没有用,所以我尝试“手动”对书籍进行分组,但我不知道这是否是正确的方法;欢迎任何提示。 如果您可以选择使用 XSLT 2.0+,这非常简单: <xsl:template match="booke" group-starting-with="title"> <book> <xsl:copy-of select="current-group()"/> </book> </xsl:template> 在 XQuery 3.1 中,可以使用 FLWOR window 子句来完成。 for tumbling window $w in books/* start at $s when $s[self::title] return <book>{$w}</book> 未测试。
DOM Xpath:在(无效)使用嵌套 <p><p> 和 </p></p> 标签
我无法选择文章的内容(在 Craft 中制作的文章),我认为是因为我以前的网站构建者在 HTML 中无效使用了双重/嵌套 P 标签。 为了澄清......的代码
我试图在下面的响应中取消“响应的测试结果”值。这来自通过 SOAP 进行的 API 调用。 我需要查询元素中的值,但为了生命......
在Python中解析Google Earth KML文件(lxml,命名空间)
我正在尝试使用 xml 模块将 .kml 文件解析为 Python(在我用于 HTML 的 BeautifulSoup 中未能完成此操作之后)。 因为这是我第一次这样做,所以我就跟着走了......
未捕获的 DOMException:无法在“CommandLineAPI”上执行“$”:不是有效的选择器
我正在使用 selenium 为我的网页编写自动化 UI 测试。 我正在测试的网页上有一个元素: << input type="checkbox" id="screening_questions[0].multiple_choice[0]-
我尝试使用 XPath 来选择 svg 元素的 fill 属性值,该值使用 CSS 变量,但我没有得到任何回报。 HTML: 我尝试使用 XPath 选择 svg 元素的 fill 属性值,该值使用 CSS 变量,但我什么也没得到。 HTML: <svg class="unf-icon" viewBox="0 0 24 24" width="24" height="24" fill="var(--N400, #6C727C)" style="display: inline-block; vertical-align: middle;"> <path d="M9.5 18a.999.999 0 01-.71-1.71l4.3-4.29-4.3-4.29a1.004 1.004 0 011.42-1.42l5 5a.998.998 0 010 1.42l-5 5a1 1 0 01-.71.29z"></path> </svg> XPath 尝试: //*[name()='svg' and fill='#6C727C'] //*[name()='svg' and @fill="#6C727C"] //*[name()='svg' and @contain(fill, "#6C727C")] 第三次尝试最接近。 改变 //*[name()='svg' and @contains(fill, "#6C727C")] 到 //*[name()='svg' and contains(@fill, "#6C727C")] 如果您想检查 fill 属性值是否有 "#6C727C" 的子字符串,或 //*[name()='svg' and @fill="var(--N400, #6C727C)"] 如果您想检查 fill 属性值是否完全等于 "var(--N400, #6C727C)" 另请参阅 HTML 5、内联 SVG 和 SVG DOM 的命名空间感知 CSS var()功能
我已阅读了我能找到的所有内容,但只是想确认以下内容不是有效的 XPath 表达式,因为标题中提到的原因。 //行程/[@trainID] 我已经发现
我正在努力扩展当前的 SimpleXML XPath 以包含“或”条件。 这是下面的原始(工作)代码,没有任何“或”条件。 $strXpathVar = "奖学金/研究&q...
我正在尝试从企业链接列表中抓取谷歌地图评论。我在为评论数据选择正确的选择器时遇到错误,因为不同的链接和评论 xpath 有所不同。有吗
XPath 根据以下节点选择节点,但前提是该节点包含某个元素
给定这个 XML 文档存根(我无法修改其生成)... 给定这个 XML 文档存根,(我无法修改其生成)... <Datastream parserApplicationName="mscorlib" parserApplicationVersion="4.0.0.0" parserAssemblyName="Prophet21.Datastream" parserAssemblyVersion="23.1.1.0"> <JOBXXXXDEF type="1" typeName="JobHeader" key="{a52722bf-c784-4d0a-b80c-d60a55179cb5}" InputFileName=""> <COPIES>1</COPIES> <HDRXXXXDEF > <TITLE>QUOTATION</TITLE> <ORDER_ACK_NUMBER>1000998</ORDER_ACK_NUMBER> </HDRXXXXDEF> <LINEXXXDEF lineno ="1" > <ORDERED_QTY>1.00</ORDERED_QTY> <ORDER_UOM>EA</ORDER_UOM> </LINEXXXDEF> <LINEXXXDEF lineno ="2"> <EXDSCXXDEF > <EXTENDED_DESCRIPTION>Delivery: 17-20 Weeks</EXTENDED_DESCRIPTION> </EXDSCXXDEF> </LINEXXXDEF> <LINEXXXDEF lineno ="3"> <ASCMPXXDEF > <QTY_PER_ASSEMBLY>1.00</QTY_PER_ASSEMBLY> </ASCMPXXDEF> </LINEXXXDEF> <LINEXXXDEF lineno ="4"> <EXDSCXXDEF > <EXTENDED_DESCRIPTION>Stainless Steel Design</EXTENDED_DESCRIPTION> </EXDSCXXDEF> </LINEXXXDEF> <LINEXXXDEF lineno ="5"> <ASCMPXXDEF > <QTY_PER_ASSEMBLY>1.00</QTY_PER_ASSEMBLY> </ASCMPXXDEF> </LINEXXXDEF> <LINEXXXDEF lineno ="6"> <ORDERED_QTY>1.00</ORDERED_QTY> <ORDER_UOM>EA</ORDER_UOM> </LINEXXXDEF> <LINEXXXDEF lineno ="7"> <EXDSCXXDEF > <EXTENDED_DESCRIPTION>Added to the above if required.</EXTENDED_DESCRIPTION> </EXDSCXXDEF> </LINEXXXDEF> <TOTALSXDEF > <SUBTOTXDEF > <TOTAL_LINES>2</TOTAL_LINES> <SUB_TOTAL>1,880.00</SUB_TOTAL> <TAXES>0.00</TAXES> <TOTAL_ECO_FEE>0.00</TOTAL_ECO_FEE> <RETAIL_DELIVERY_FEE>0.00</RETAIL_DELIVERY_FEE> <JURISDICTION_DESC /> </SUBTOTXDEF> <GRDTOTXDEF "> <GRAND_TOTAL>1,880.00</GRAND_TOTAL> <CURRENCY_DESC>U.S. Dollars</CURRENCY_DESC> </GRDTOTXDEF> </TOTALSXDEF> </FORMXXXDEF> </JOBXXXXDEF> </Datastream> 我需要一个或多个 XPath 查询来选择 LINEXXDEF 有一个名为 ASCMPXXDEF 的子节点的整个节点,然后如果该父节点之后的 NEXT LINEXXDEF 有一个名为 EXDSCXXDEF 的子节点,我需要该节点。 所以在上面,我需要这些节点,用于上面的第 3、4 和 5 行 <LINEXXXDEF lineno ="3"> <ASCMPXXDEF > <QTY_PER_ASSEMBLY>1.00</QTY_PER_ASSEMBLY> </ASCMPXXDEF> </LINEXXXDEF> <LINEXXXDEF lineno ="4"> <EXDSCXXDEF > <EXTENDED_DESCRIPTION>Stainless Steel Design</EXTENDED_DESCRIPTION> </EXDSCXXDEF> </LINEXXXDEF> <LINEXXXDEF lineno ="5"> <ASCMPXXDEF > <QTY_PER_ASSEMBLY>1.00</QTY_PER_ASSEMBLY> </ASCMPXXDEF> </LINEXXXDEF> 我需要第 3 行,因为它有 ASCMPXXDEF 作为子项,我需要第 4 行,因为它有一个名为 EXDSCXXDEF 的子项,我需要第 5 行,因为它又有一个 ASCMPXXDEF 子项。 我最接近的是这个 XPATH //ASCMPXXDEF/parent::*/following-sibling::LINEXXXDEF[EXDSCXXDEF][1] | //ASCMPXXDEF/parent::* 但这正在回归 <LINEXXXDEF lineno ="3"> <ASCMPXXDEF > <QTY_PER_ASSEMBLY>1.00</QTY_PER_ASSEMBLY> </ASCMPXXDEF> </LINEXXXDEF> <LINEXXXDEF lineno ="4"> <EXDSCXXDEF > <EXTENDED_DESCRIPTION>Stainless Steel Design</EXTENDED_DESCRIPTION> </EXDSCXXDEF> </LINEXXXDEF> <LINEXXXDEF lineno ="5"> <ASCMPXXDEF > <QTY_PER_ASSEMBLY>1.00</QTY_PER_ASSEMBLY> </ASCMPXXDEF> </LINEXXXDEF> <LINEXXXDEF lineno ="7"> <EXDSCXXDEF > <EXTENDED_DESCRIPTION>Added to the above if required.</EXTENDED_DESCRIPTION> </EXDSCXXDEF> </LINEXXXDEF> 但它包括第 7 行,这是我不想要的,因为第 7 行不直接跟随包含 ASCMPXXDEF 的 LINEXXXDEF 节点。 有没有办法让 XPATH 仅评估下一个同级? 本质上我得到了第 7 行,因为第 5 行是一个 ASCMPXXDEF 节点,但如果它直接位于第 6 行之后,我只需要它。第 6 行是我的评估过程的重新启动...但 XPATH 会跳过它,但因为第 7 行在第 5 行之后,所以它被包含在内。 我也在使用 C# 工作,如果有更简单的操作方法... 我正在尝试找出如何删除包含 EXDSCXXDEF 但紧随包含 ASCMPXXDEF 的节点之后的任何节点 <LINEXXXDEF lineno ="3"> <ASCMPXXDEF > <QTY_PER_ASSEMBLY>1.00</QTY_PER_ASSEMBLY> </ASCMPXXDEF> </LINEXXXDEF> <LINEXXXDEF lineno ="4"> <EXDSCXXDEF > <EXTENDED_DESCRIPTION>Stainless Steel Design</EXTENDED_DESCRIPTION> </EXDSCXXDEF> </LINEXXXDEF> <LINEXXXDEF lineno ="5"> <ASCMPXXDEF > <QTY_PER_ASSEMBLY>1.00</QTY_PER_ASSEMBLY> </ASCMPXXDEF> </LINEXXXDEF> *this node below should not be included <LINEXXXDEF lineno ="7"> <EXDSCXXDEF > <EXTENDED_DESCRIPTION>Added to the above if required.</EXTENDED_DESCRIPTION> </EXDSCXXDEF> </LINEXXXDEF>* 下面的XPath将会得到你想要的。 /Datastream/JOBXXXXDEF/LINEXXXDEF[ ASCMPXXDEF or (EXDSCXXDEF and preceding-sibling::LINEXXXDEF[1][ASCMPXXDEF ]) ] 点网小提琴
我正在尝试从下拉菜单中选择该选项。但它没有被选中。测试用例通过,没有任何错误,也没有选择该选项。因为它是 HTML 下拉菜单,所以我...
Selenium WebDriver By.xpath 并不总是有效
信息: 我从配置文件中获取 fieldXpath,它是“//input[@id='signin_password']” HTML: 信息: 我从配置文件中得到fieldXpath,它是"//input[@id='signin_password']" HTML: <li><input type="password" name="signin[password]" id="signin_password" /></li> 有效:(但并非总是如此) 陷入困境... public void doAction(WebDriver driver) throws TestException { try { WebElement el = driver.findElement(By.xpath(fieldXpath)); el.clear(); el.sendKeys(fieldValue); } catch (Exception e) { throw new TestException(this.getClass().getSimpleName() + ": problem while doing action : " + toString()); } } 是否有解决方案可以使该代码与 XPath 一起使用? 我发现了问题...:selenium WebDriver StaleElementReferenceException *This may be caused because the page isn't loaded completely when the code starts or changes when the code is executed. You can either try to wait a little longer for the element or catch the StaleReferenceException and try again finding the div and the span.* 我的代码:(在每个字段之前调用这些函数) /** * Handle StaleElementReferenceException * @param elementXpath * @param timeToWaitInSec */ public void staleElementHandleByXpath(String elementXpath, int timeToWaitInSec) { int count = 0; while (count < 10) { try { WebElement slipperyElement = driver.findElement(By.xpath(elementXpath)); if (slipperyElement.isDisplayed()) { slipperyElement.click(); // may throw StaleElementReferenceException } count = count + 10; } catch (StaleElementReferenceException e) { count = count + 1; // try again } catch (ElementNotVisibleException e) { count = count + 10; // get out } catch (Exception e) { count = count + 10; // get out } finally { // wait X sec before doing the action driver.manage().timeouts().implicitlyWait(timeToWaitInSec, TimeUnit.SECONDS); } } } /** * Wait till the document is really ready * @param js * @param timeToWaitInSec */ public void waiTillDocumentReadyStateComplete(JavascriptExecutor js, int timeToWaitInSec) { Boolean ready = false; int count = 0; while (!ready && count < 10) { ready = (Boolean) js.executeScript("return document.readyState == 'complete';"); // wait X sec before doing the action driver.manage().timeouts().implicitlyWait(timeToWaitInSec, TimeUnit.SECONDS); count = count + 1; } } 使用单引号 ' 而不是 "。所以 String fieldXpath = "//input[@id='signin_password']";