xsl用于函数迭代引入不需要的空格

时间:2011-07-01 16:40:51

标签: xml xslt saxon

我正在使用基本的“超级”xml文件和参考xml文件生成xml输出,以列出我需要的超级文件的部分。

问题在于功能。当我用它迭代一个集合并有条件地输出一个值时,它会不断输出空格而不匹配!

这是我的代码

    <xsl:attribute
        name="type"
        select="
        for $index_type in $ref_indexes/@type
        return (if
        (translate($index_type, 'ABCDEFGHIJKLMNOPQRSTUVWXYZ ',
        'abcdefghijklmnopqrstuvwxyz') = ./@type)
        then $index_type
        else '')) "/>

$ref_indexes/@type可以包含的地方

 "abc def ghi MNO"

./@type将是

的单个元素
 {abc,def,ghi,jkl,mno,pqr}

结果始终在属性中包含空格,即:

type="abc..."
type=".def.."
type="..ghi."
type="...MNO"

  • 我尝试过使用相交并得到了这个:
  

“'intersect'的第一个操作数的必需项类型是node();提供的值有     item type xs:string“

  • 我试过nomalize-space并得到了这个:
  

“不允许多个项目的序列作为第一个参数     正常化空间()“

  • 当我使用distinct-values时,它只给我一个空间,这特别令人沮丧,因为它非常接近!

  • 我已经尝试检查结果的长度&gt; 1,还是我得到了空间。我也尝试在翻译中加入一个空格。


FWIW我正在使用Java 1.5.0_26和Saxon 9 HE在OSX(10.6.7)上进行转换。

在这个阶段,我几乎没有想法:(

所有和任何帮助都热烈赞赏,

加里

2 个答案:

答案 0 :(得分:0)

确实

<xsl:attribute
name="type"
select="
string-join(for $index_type in $ref_indexes/@type
return (if
(translate($index_type, 'ABCDEFGHIJKLMNOPQRSTUVWXYZ ',
'abcdefghijklmnopqrstuvwxyz') = ./@type)
then $index_type
else ''), '') "/>

做你想做的事?如果不考虑发布最小但完整的样本,以便我们重现问题。

[编辑]我想简单地做

<xsl:attribute
name="type"
select="$ref_indexes/@type[translate(., 'ABCDEFGHIJKLMNOPQRSTUVWXYZ ',
'abcdefghijklmnopqrstuvwxyz') = current()/@type]"/>

可能就够了。

答案 1 :(得分:0)

我对你变量中的内容感到有点困惑,但在我看来,这个

select="
        for $index_type in $ref_indexes/@type
        return (if
        (translate($index_type, 'ABCDEFGHIJKLMNOPQRSTUVWXYZ ',
        'abcdefghijklmnopqrstuvwxyz') = ./@type)
        then $index_type
        else '')) "

真的只是意味着:

select="$ref_indexes/@type[lower-case(.)=lower-case(current()/@type)]"

现在确实,如果选择多个值,则值将在输出中以空格分隔。这就是xsl:attribute的工作方式。您是否尝试在xsl:attribute指令上设置separator =“”?

我担心你的关于“相交”和“规范化空间”的信息并不能很好地反映你的一般方法。他们给人的印象是,你在挑选任何移动并试一试的功能,而不是花时间阅读和学习。