我有一个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('["',$FirstName, '", ', '"', $LastName, '", ', '"', $MiddleName, '", ', '"', $SuffixName, '"]')" />
</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>
我尝试过几种不同的方法。如果我看到前导空格或尾随空格而不是中间空格,那对我来说是有道理的。任何帮助将不胜感激。
答案 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
循环之前和之后。
此更改使脚本更有效,更易于阅读。