尝试使用XSLT转换XML,但输出行中断

时间:2018-04-22 01:08:50

标签: xml xslt xslt-1.0

尝试使用XSLT转换XML,但输出行中断。

这是我的代码:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
exclude-result-prefixes="xs"
version="1.0">

 <xsl:template match="/" >
    <data>
     <content>
            <xsl:for-each select="//t[@pos='ADV' or @pos='ADJD' or @pos='ADJA' or @pos='NE' or 
                                      @pos='NN' or @pos='VMFIN' or @pos='VVINF' or @pos='VAFIN' or 
                                      @pos='VVPP' or @pos='VVFIN']">
                <xsl:sort select="@word"/>
                    <token>
                        <xsl:value-of select="@word"/>
                        (<xsl:value-of select="@lemma"/>;
                        <xsl:value-of select="@pos"/>;
                        <xsl:value-of select="@morph"/>)
                    </token>
            </xsl:for-each>    
    </content>
   </data>
 </xsl:template>    
</xsl:stylesheet> 

我将此作为输出:

<?xml version="1.0" encoding="utf-8"?><data><content><token>Aktivitäten
                        (Aktivität;
                        NN;
                        Acc.Pl.Fem)
                    </token><token>Bank
                        (Bank;
                        NN;
                        Dat.Sg.Fem)
                    </token><token>Behörden
                        (Behörde;
                        NN;
                        Dat.Pl.Fem)
                    </token>

我试图复制此输出结果

<?xml version="1.0" encoding="UTF-8"?>
<data>
 <content>
   <token>Aktivitäten(Aktivität;NN;Acc.Pl.Fem)</token>
   <token>Bank(Bank;NN;Dat.Sg.Fem)</token>
   <token>Behörden(Behörde;NN;Dat.Pl.Fem)</token>
   etc...

我是XSLT的新手,感谢您的帮助

2 个答案:

答案 0 :(得分:3)

当与(;)等其他文字文本相邻时,通常无关紧要的空白区域变得非常重要。

如果你在xsl:text

中包装每个字符串(字符)
                    <xsl:value-of select="@word"/>
                    <xsl:text>(</xsl:text>
                    <xsl:value-of select="@lemma"/>
                    <xsl:text>;<xsl:text>
                    ...

您将获得所需的XML输出。

[感谢@Tomalak]消除不需要的空格的另一种方法是将字符串值连接在一个xsl:value-of中:

<xsl:value-of select="concat(@word, '(', @lemma, ';', @pos, ';', @morph, ')')" />

答案 1 :(得分:1)

让我们从输出的开头开始:

<?xml version="1.0" encoding="utf-8"?><data><content><token>

这是默认输出indent属性设置为no的结果。 此设置的原因是,如果不读取输出XML 人类,当它不包含额外的空间时,它的处理速度更快 和换行符。

您的token输出标记具有“其他”换行符和空格的原因 是它们实际上包含在你的脚本中。

查看脚本的以下片段:

<xsl:value-of select="@word"/>
(<xsl:value-of select="@lemma"/>;

<xsl:value-of select="@word"/>脚本包含文本标记后, 含有:

  • 换行,
  • 一些空格,
  • ,最后是( - 唯一真正应该打印的东西。

要获得所需的结果,请进行2次更改:

  • xsl:stylesheet打开代码后,添加<xsl:output indent="yes"/>
  • 使用tokenxsl:value-of的内容更改为单个select="concat(...)" 将所有内容打印为concat函数的参数。

有关工作示例,请参阅http://xsltransform.net/aiwQ3T