Имам такъв 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="( )">
<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
Просто променете регекса като такъв ^( )
: тя ще съответства само на интервалите в началото на текстовата част.
С този 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>