/ / XSLT-text()ノードの特定のコンテンツを新しいノードに置き換えます-regex、xml、xslt、xslt-2.0

XSLT - text()ノードの特定の内容を新しいノードに置き換える - regex、xml、xslt、xslt-2.0

私はこのようなxmlを持っています、

 <doc>
<p>Biological<sub>89</sub> bases<sub>4456</sub> for<sub>8910</sub> sexual<sub>4456</sub>
differences<sub>8910</sub> in<sub>4456</sub> the brain exist in a wide range of
vertebrate species, including chickens<sub>8910</sub> Recently<sub>8910</sub> the
dogma<sub>8910</sub> of<sub>4456</sub> hormonal dependence for the sexual
differentiation of the brain has been challenged.</p>
</doc>

ご覧のように <sub> ノードと text() ノードは内部に含まれています <p> ノード。そしてすべて <sub> ノードの終わりには、スペースで始まるテキストノードがあります。 (例えば: <sub>89</sub> bases :ここで「ベース」テキストが表示される前にスペースが存在します。)これらの特定のスペースをノードに置き換える必要があります。

したがって、期待される出力は次のようになります。

<doc>
<p>Biological<sub>89</sub><s/>bases<sub>4456</sub><s/>for<sub>8910</sub><s/>sexual<sub>4456</sub>
<s/>differences<sub>8910</sub><s/>in<sub>4456</sub><s/>the brain exist in a wide range of
vertebrate species, including chickens<sub>8910</sub><s/>Recently<sub>8910</sub><s/>the
dogma<sub>8910</sub><s/>of<sub>4456</sub><s/>hormonal dependence for the sexual
differentiation of the brain has been challenged.</p>
</doc>

これを行うには、次のような正規表現を使用できます。

<xsl:template match="p/text()">
<xsl:analyze-string select="." regex="(&#x20;)">
<xsl:matching-substring>
<xsl:choose>
<xsl:when test="regex-group(1)">
<s/>
</xsl:when>
</xsl:choose>
</xsl:matching-substring>
<xsl:non-matching-substring>
<xsl:value-of select="."/>
</xsl:non-matching-substring>
</xsl:analyze-string>
</xsl:template>

しかし、これは追加します <s/> text()ノードのすべてのスペースへのノード。しかし、私はその特定のスペースにノードを追加するだけで済みます。

誰かが私にこれを行う方法を提案できますか?

回答:

回答№1は2

スペースで始まり、前に sub 要素、あなたはあなたのテンプレートの一致に条件を置くことができます

<xsl:template match="p/text()[substring(., 1, 1) = " "][preceding-sibling::node()[1][self::sub]]">

また、文字列の先頭のスペースを削除したいだけの場合は、単純な置換で十分です。

<xsl:value-of select="replace(., "^s+", "")" />

このXSLTを試してみてください

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0">
<xsl:output method="xml" indent="no" />

<xsl:template match="p/text()[substring(., 1, 1) = " "][preceding-sibling::node()[1][self::sub]]">
<s />
<xsl:value-of select="replace(., "^s+", "")" />
</xsl:template>

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

回答№2の場合は1

そのように正規表現を変更するだけです ^(&#x20;):テキスト部分の先頭のスペースのみに一致します。

このXSLを切り取って:

<xsl:analyze-string select="." regex="^(&#x20;)">

これが私が得た結果です:

<p>Biological<sub>89</sub><s></s>bases<sub>4456</sub><s></s>for<sub>8910</sub><s></s>sexual<sub>4456</sub>
differences<sub>8910</sub><s></s>in<sub>4456</sub><s></s>the brain exist in a wide range of
vertebrate species, including chickens<sub>8910</sub><s></s>Recently<sub>8910</sub><s></s>the
dogma<sub>8910</sub><s></s>of<sub>4456</sub><s></s>hormonal dependence for the sexual
differentiation of the brain has been challenged.
</p>