1

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

问题是for函数。当我使用它来迭代一个集合并有条件地输出一个值时,它会不断输出不匹配的空格!

这是我的代码

    <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 并得到了这个:

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

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

“一个以上项目的序列不允许作为 normalize-space() 的第一个参数”

  • 当我使用distinct-values它时,它只给了我一个空间,这尤其令人沮丧,因为它是如此接近!

  • 我也尝试检查长度 > 1 的结果,但我仍然得到空格。我也尝试在翻译中包含一个空格。


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

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

热烈感谢所有和任何帮助,

加里

4

2 回答 2

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]"/>

可能就足够了。

于 2011-07-01T16:46:17.750 回答
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=""?

恐怕您关于“相交”和“规范化空间”的信息并不能很好地反映您的一般方法。它们给人的印象是,您正在纠结于选择任何移动的功能并尝试一下,而不是花时间阅读和学习。

于 2011-07-01T21:17:39.867 回答