gpt4 book ai didi

xml - 匹配 XML 文档中特定元素第一次出现的模板

转载 作者:数据小太阳 更新时间:2023-10-29 03:02:52 30 4
gpt4 key购买 nike

我有一个 XML 文档,其结构类似于以下内容:

<article>
<header>
<metadata>
bunch of metadata nodes here
<abstract>
<p>this is one of the abstract's paragraphs</p>
</abstract>
</metadata>
</header>
<body>
<sec>
<title>This is title 1</title>
<p>Paragraph 1</p>
<p>paragraph 2</p>
<title>This is title 2</title>
<sec>
<title>This is title 3</title>
<p>paragraph 1 under title 3</p>
<p>paragraph 2 under title 3</p>
</body>
</article>

真实的 XML 肯定会比上面的复杂得多,但它应该足以说明。

我只需要将特定模板应用于第一个 <p> <body> 中出现的元素元素。我可以轻松编写一个 xpath 表达式来选择我感兴趣的节点:

(//body//p)[1]

不幸的是,这个 xpath 表达式不能用作 XSLT 中的匹配表达式

<xsl:template match="(//body//p)[1]">
<p_first>
<xsl:call-template name="copyElementAttributes" />
<xsl:apply-templates select="@*|node()" />
</p_first>
</xsl:template>

上面的模板在尝试通过 XSL 引擎运行时会抛出错误。是否有可用于选择元素的匹配表达式?

最佳答案

你必须使用类似的东西

<xsl:template match="body//p[count(preceding::p) = count(ancestor::body/preceding::p)]">

即找到一个 p body 里面还有其他的数量p it 前面的元素与开头前面的数字相同 <body>标签。

或者

<xsl:template match="body//p[not(preceding::p[ancestor::body])]">

会寻找 p没有任何前身p本身是 body 后代的元素. ancestor::body约束是必要的,因为每个 body//p前面是 pabstract 里面.如果可以有多个 body,它会变得更加复杂元素,因为我们只检查 p a 里面的 s body元素,不一定相同 body .

关于xml - 匹配 XML 文档中特定元素第一次出现的模板,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21385751/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com