私はこのような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="( )">
<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
そのように正規表現を変更するだけです ^( )
:テキスト部分の先頭のスペースのみに一致します。
このXSLを切り取って:
<xsl:analyze-string select="." regex="^( )">
これが私が得た結果です:
<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>