XSLT 1.0在字符串之间添加了额外的空格

时间:2018-01-19 20:16:15

标签: xml xslt xml-parsing xslt-1.0

我有一个XSLT转换,我在其中提取客户名称详细信息。我正在使用XSLT 1.0。转换似乎在字符串之间插入了额外的空格。以下示例和详细信息:

XML:

list = ['doThis','doThat']
for item in list:
    sampleobject.item

XSLT:

<Root>
   <Customer>
      <PrimaryGuest>
       <FirstName>Jonathan (Jonny)</FirstName>
       <LastName>Doe</LastName> 
       <MiddleName>Lewis</MiddleName>
     </PrimaryGuest>
     <PrimaryGuest>
       <FirstName>Mary</FirstName>
       <LastName>Doe</LastName> 
       <MiddleName>L</MiddleName>
     </PrimaryGuest>
  </Customer>
</Root>

输出:

<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:exslt="http://exslt.org/common"
xmlns:exsl="http://exslt.org/common" exclude-result-prefixes="exsl xsl xsd exslt"
version="1.0">

<xsl:output omit-xml-declaration="yes" />
<xsl:variable name="TravelerName">
 <xsl:choose>
    <xsl:when test="$LOB = 11">
        <xsl:for-each select="Root/Customer/PrimaryGuest | Root/PriorCustomer/PrimaryGuest">
         <xsl:if test="(position() = '1')">[</xsl:if>
            <xsl:variable name="FirstName">
                <xsl:value-of select="FirstName" />
            </xsl:variable>
            <xsl:variable name="LastName">
                <xsl:value-of select="LastName" />
            </xsl:variable>
            <xsl:variable name="MiddleName">
                <xsl:value-of select="MiddleName" />
            </xsl:variable>
            <xsl:variable name="SuffixName">
                <xsl:value-of select="SuffixName" />
            </xsl:variable>
            <xsl:variable name="TravelerName">
                <xsl:value-of
                        select="concat('[&quot;',$FirstName, '&quot;, ', '&quot;', $LastName, '&quot;, ', '&quot;', $MiddleName, '&quot;, ', '&quot;', $SuffixName, '&quot;]')" />
            </xsl:variable>
            <xsl:value-of select="$TravelerName" />
                <xsl:if test="not(position() = last())">, </xsl:if>
                <xsl:if test="(position() = last())">]</xsl:if>
        </xsl:for-each>
    </xsl:when>
    <xsl:otherwise>
        <xsl:text></xsl:text>
    </xsl:otherwise>
</xsl:choose>
</xsl:variable>

我尝试过几种不同的方法。如果我看到前导空格或尾随空格而不是中间空格,那对我来说是有道理的。任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:0)

最短的答案

也许您的源XML 包含例如 Tab 字符或额外空格 (例如在 FirstName 中)? 要使脚本能够抵抗此类情况,请使用normalize-space函数。

现在版本更长

我使用略微修改的版本检查了您的原始源XML 您的XSLT脚本,使用版本 1.0 Xalan 处理器, 见http://xsltransform.net/6q1R79r,输出正常。

请注意,我已将select中的for-each更改为Root/*/PrimaryGuest

原因是|中的 XSLT 1.0 select(联合运算符)没有 工作(虽然它适用于match表达式)。 要在&#34;我的&#34;上验证这一点例如,将| x添加到select属性 (在for-each中),输出会更短。

如果您想将select范围限制为客户 PriorCustomer , 在*谓词后添加:[name()='Customer' or name()='PriorCustomer']

另一句话:

在你的代码中我看到了一个奇怪的做法: 您创建一个变量(例如FirstName),其中包含一个名称相同的元素, 此变量的唯一目的是在value-of中输出其值(在本例中为$FirstName)。

我认为仅使用元素名称更简单,而不创建 任何临时变量,就像我在脚本中所做的那样。

另请注意,可以输出初始[和尾随] 分别在for-each循环之前和之后。 此更改使脚本更有效,更易于阅读。