在XSLT中删除两个字符串和节点之间的空间

时间:2019-06-26 03:26:14

标签: xslt

我想删除XSLT中两个字符串和节点之间的空间。我正在使用XSLT 2.0

输入:

<p type="c"><doc ref="core" id="k12234"><t/>AWS H <t/>(ever over)<t/></doc><refformat="no" ref="core" rid="ck1123"/>00</p>

输出应为:

<p type="c"><doc ref="core" id="k12234"><t/>AWS H<t/>(ever over)<t/></doc><refformat="no" ref="core" rid="ck1123"/>00</p>

AWS H<t/>之间的空格应从输出中删除。

4 个答案:

答案 0 :(得分:1)

输入

<?xml version="1.0" encoding="UTF-8"?>
<root>
<ajeet>aaaaa </ajeet>
<kumar> bbbbb</kumar>
</root>

xsl

<?xml version="1.0" encoding="UTF-8"?>
  <xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:template match="/">
     <singh><xsl:value-of select="normalize-space(//ajeet)"/></singh>
    </xsl:template>
  </xsl:stylesheet>

输出:-

<?xml version="1.0" encoding="UTF-8"?>
<singh>aaaaa</singh>

答案 1 :(得分:1)

如果要删除后跟<t />节点的任何文本节点的尾随空格,可以执行此操作。...

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

  <xsl:template match="text()[following-sibling::node()[1][self::t]]">
     <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>

请注意,您可以在此处使用normalize-space而不是replace,但这也将删除前导空格,这可能是您可能想要的,也可能不是。

请注意,如果您只想定位以AWS开头的文本节点,则可以像这样调整模板匹配:

<xsl:template match="text()[starts-with(., 'AWS')][following-sibling::node()[1][self::t]]">

http://xsltfiddle.liberty-development.net/6r5Gh3W上查看此操作

答案 2 :(得分:0)

<xsl:strip-space elements="*"/>
    <xsl:template match="@*|node()">
        <xsl:copy>
            <xsl:apply-templates select="@*|node()"/>
        </xsl:copy>
    </xsl:template>
    <xsl:template match="//text()">
        <xsl:value-of select="normalize-space(.)"/>
    </xsl:template>
Try this using normalize-space

答案 3 :(得分:0)

请参见下面的代码,仅在“ text()节点与”之间发生空格删除。:

输入XML:

<root>
<p type="c"><doc ref="core" id="k12234">The <ii>pp</ii> the <t/>AWS H <t/>(ever over) <l>the </l><t/></doc><ref format="no" ref="core" rid="ck1123"/>00</p>
<p type="c"><doc ref="core" id="k12234"><t/>AWS H <t/>(ever over)<t/></doc><ref format="no" ref="core" rid="ck1123"/>00</p>
</root>

XSLT:

<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="@*|node()">
    <xsl:copy><xsl:apply-templates select="@*|node()"/></xsl:copy>
</xsl:template>

<xsl:template match="doc">
    <xsl:copy>
        <xsl:apply-templates select="@*"/>
        <xsl:for-each-group select="node()" 
            group-adjacent="exists(following-sibling::node()[1][self::t]) and self::text()">
            <xsl:choose>
                <xsl:when test="current-grouping-key()">
                    <xsl:value-of select="normalize-space()"/>
                </xsl:when>
                <xsl:otherwise>
                    <xsl:apply-templates select="current-group()"/>
                </xsl:otherwise>
            </xsl:choose>
        </xsl:for-each-group>
    </xsl:copy>
</xsl:template>

</xsl:stylesheet>

结果:

<root>
<p type="c"><doc ref="core" id="k12234">The <ii>pp</ii>the<t/>AWS H<t/>(ever over) <l>the </l><t/></doc><ref format="no" ref="core" rid="ck1123"/>00</p>
<p type="c"><doc ref="core" id="k12234"><t/>AWS H<t/>(ever over)<t/></doc><ref format="no" ref="core" rid="ck1123"/>00</p>
</root>