gpt4 book ai didi

xpath - 在同级之前,之后和之间转换混合的文本和节点

转载 作者:行者123 更新时间:2023-12-03 16:18:26 27 4
gpt4 key购买 nike

我正在寻找一些段落标记中具有块级元素的XML。 XML类似于:

<p>
This is some text with <tag>some other markup</tag> in it that also needs transformation
<div>
Oh no here is a block element
</div>
It is even worse as <i>there is more content</i> between that needs transform
<div>
more block content
</div>
more text
</p>


因此,模式是任意文本和混合有块级元素的节点。这里的div和其他文本可以是任意数量,因此使用索引的答案不适用于所有情况。

我希望将其转换为

 <p>This is some text with <transformed-tag>some other markup</transformed-tag> in it that also needs transformation</p>
<div>Oh no here is a block element</div>
<p>It is even worse as <i>there is more content</i> between that needs transform</p>
<div>more block content</div>
<p>more text</p>


因此,从本质上讲,我想捕获所有不在 p标记中的 div子代,并在保留文本和div顺序的同时,用 p标记包装它们。我已经尝试了所有方法,但不确定如何在div之间捕获文本。我已经能够使用以下方法将数据从第一个Blob转换为第一个div,然后将数据从最后一个div转换为最后一个

<xsl:template match="p[following::div]">
<p><xsl:apply-templates/></p>
</xsl:template>


<xsl:template match="p[preceding::div]">
<p><xsl:apply-templates/></p>
</xsl:template>


更新:使输出匹配。在divs和p标记中输出的文本也需要应用模板,因为其中嵌套的元素需要应用样式。

最佳答案

好的,我在这里想念什么?

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>

<xsl:template match="/p">
<root>
<xsl:apply-templates select="node()[1]" mode="first"/>
<xsl:apply-templates select="div[1]"/>
</root>
</xsl:template>

<xsl:template match="node()" mode="first">
<p>
<xsl:copy/>
<xsl:apply-templates select="following-sibling::node()[1][not(self::div)]" mode="next"/>
</p>
</xsl:template>

<xsl:template match="node()" mode="next">
<xsl:copy>
<xsl:apply-templates/>
</xsl:copy>
<xsl:apply-templates select="following-sibling::node()[1][not(self::div)]" mode="next"/>
</xsl:template>

<xsl:template match="tag" mode="next">
<transformed-tag>
<xsl:apply-templates/>
</transformed-tag>
<xsl:apply-templates select="following-sibling::node()[1][not(self::div)]" />
</xsl:template>

<xsl:template match="div">
<xsl:copy-of select="."/>
<xsl:apply-templates select="following-sibling::node()[1][not(self::div)]" mode="first"/>
<xsl:apply-templates select="following::div[1]"/>
</xsl:template>

</xsl:stylesheet>

关于xpath - 在同级之前,之后和之间转换混合的文本和节点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23553147/

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