XSLT - 用新节点

时间:2015-11-17 09:33:10

标签: 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:此前&#39; base&#39;文本出现存在空格。)我需要用节点替换这些特定空格。

所以预期的输出应该是这样的,

<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()节点中的每个空格。但我只需要在特定空间添加节点。

任何人都可以建议我一个方法我该怎么做..

2 个答案:

答案 0 :(得分:2)

如果您只想匹配以空格开头且前面有var pricesTable = $('#pricesTable').DataTable({ data: viewModel.product.PriceItems, columns: [{ data: 'Id', visible: false }, { data: 'Name' }, { data: 'Value' }, { data: 'CurrencySymbol' }, { data: 'UnitName' }], sort: false, processing: false, serverSide: false, deferLoading: 0, info: false, filter: false, lengthChange: false, fnInitComplete: function (oSettings, json) { $('#pricesTable tbody tr:eq(0)').click(); } }); 元素的文本节点,则可以将条件放在模板匹配中

var viewModel = new ProductFormViewModel(@Html.Raw(Json.Encode(Model)));

如果你只想删除字符串开头的空格,那么就可以进行简单的替换。

sub

试试这个XSLT

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

答案 1 :(得分:1)

只需像sizeof(a)那样更改正则表达式:它只匹配文本部分开头的空格。

使用此XSL剪切:

a

以下是我获得的结果:

^(&#x20;)