/ / XSLT - заменя конкретно съдържание на текста () възел с нов възел - regex, xml, xslt, xslt-2.0

XSLT - заменя конкретно съдържание на текста () възел с нов възел - 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 : тук преди да се появи текстът "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/> възли до всички интервали в текста () възел. Но имам нужда само от добавяне на възли към конкретните пространства.

Може ли някой да ми предложи метод как мога да направя това ..

Отговори:

2 за отговор № 1

Ако искате да съвпадате само с текстови възли, които започват с интервал и се предхождат от a 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>

1 за отговор № 2

Просто променете регекса като такъв ^(&#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>