如何在以前的节点中找到特定的“字符串”,但是在先前节点的某些范围内,而不是在整个先前节点中

时间:2017-12-01 04:13:23

标签: xml xslt xslt-1.0 xslt-2.0

如何在以前的节点中找到特定的“字符串”,但是在先前节点的某些范围内,而不是在整个先前节点中。

例1:
输入:
<p>0Sum of [squares] test1<br/>[Factor1 Section]<b>A<br/>2Sum</b> of <i>(squares) test2 </i> test <br/>[Factor2] <b>(A)</b></p>

要求输出:
如果方案匹配,我需要将<br/>更改为<p></p>
<p>0Sum of [squares] test1</p><p>[Factor1 Section]<b>A<br/>2Sum</b> of <i>(squares) test2 </i> test <br/>[Factor2] <b>(A)</b></p>

例2:
它应该是在另一个段落中的一段时间内工作。您可以看到下面的示例xml,在这种情况下它不会进行任何更改 输入:
<p>[A]</b></p><p><br/>[0Sum of squares]</p>

要求输出:
<p>[A]</b></p><p><br/>[0Sum of squares]</p>

首先,我需要找到br[following-sibling::node()[1][matches(.,'^\[')],然后需要查找 - 如果以前的节点中存在任何“]”,但该查找范围应该是前一个<br/>标记(即前一个<br/>代码的一个<br/>代码。)

注意:我已经为此制作了代码,我在下面给出了您的评论。但我需要更好,更直接的代码。有人可以帮助我!

<xsl:template match="br[(following-sibling::node()[1][matches(normalize-space(.),'^\[')] and preceding-sibling::node()[matches(.,'\]')]>
<xsl:variable name="brcounts" select="count(preceding-sibling::br)"/>
<xsl:if test="$brcounts &gt; 0">
<xsl:choose>
<xsl:when test="(following-sibling::node()[1][matches(normalize-space(.),'^\[')] and preceding-sibling::node()[matches(.,'\]')]) and (preceding-sibling::node()[matches(.,'\]') and count(preceding-sibling::br) = $brcounts])">
</xsl:when>
<xsl:otherwise>
<xsl:copy />
</xsl:otherwise>
</xsl:choose>
</xsl:if>
<xsl:if test="$brcounts = 0">
<xsl:choose>
<xsl:when test="(following-sibling::node()[1][matches(normalize-space(.),'^\[')] and preceding-sibling::node()[matches(.,'\]')])">
</xsl:when>
<xsl:otherwise>
<xsl:copy />
</xsl:otherwise>
</xsl:choose>
</xsl:if>
</xsl:template>

1 个答案:

答案 0 :(得分:0)

你可以试试这个

<!-- Identical Transform -->
<xsl:template match="node()|@*">
    <xsl:copy>
        <xsl:apply-templates select="node()|@*"/>
    </xsl:copy>
</xsl:template>

<xsl:template match="br[following-sibling::node()[1][matches(., '^\[')]]
    [preceding-sibling::node()[matches(., '\]')]]
    [generate-id(.) = generate-id(preceding-sibling::node()[matches(., '\]')][1]/following::br[1])]">
    <xsl:text disable-output-escaping="yes">&lt;/p>&lt;p></xsl:text>
</xsl:template>

输出和脚本

http://xsltransform.hikmatu.com/pPgCcom/3