0

我有一些像这样的简单 XML ......

<?xml version="1.0" encoding="UTF-8"?>
<root>
    <sentence>
        <word1>The</word1>
        <word2>cat</word2>
        <word3>sat</word3>
        <word4>on</word4>
        <word5>the</word5>
        <word6>mat</word6>
    </sentence>
    <sentence>
        <word1>The</word1>
        <word2>quick</word2>
        <word3>brown</word3>
        <word4>fox</word4>
        <word5>did</word5>
        <word6>nothing</word6>
    </sentence>
</root>

我想要做的是用 XSLT 处理这个来创建一个句子,就像这个 The~cat~sat~on~the~mat

(这是我最终想要做的一个简化示例,这只是现在的一个绊脚石)。

我的 XSLT 看起来像这样;

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

    <xsl:output indent="no" />
    <xsl:template match="text()[not(string-length(normalize-space()))]"/>
    <xsl:strip-space elements="*"/>

    <xsl:template match="/">
        <xsl:text>&#xa;</xsl:text>
        <xsl:apply-templates />
     </xsl:template>  

    <xsl:template match="/root/sentence">
        <xsl:apply-templates />
        <xsl:text>&#xa;</xsl:text>
    </xsl:template>

    <xsl:template match="word1">
        <xsl:value-of select="text()" />
        ~
    </xsl:template>

    <xsl:template match="word2">
        <xsl:value-of select="text()" />
        ~
    </xsl:template>

    <xsl:template match="word3">
       <xsl:value-of select="text()" />
       ~
    </xsl:template>

    <xsl:template match="word4">
        <xsl:value-of select="text()" />
        ~
    </xsl:template>

    <xsl:template match="word5">
        <xsl:value-of select="text()" />
        ~
    </xsl:template>

    <xsl:template match="word6">
        <xsl:value-of select="text()" />
        ~
    </xsl:template>
</xsl:stylesheet>

如果我在 XML 上运行样式表,我会在它自己的一行上得到每个单词,然后在下一行得到一个 tilda,就像这样

<?xml version="1.0" encoding="UTF-8"?>
The
        ~
    cat
        ~
    sat
        ~
    on
        ~
    the
        ~
    mat
        ~

The
        ~
    quick
        ~
    brown
        ~
    fox
        ~
    did
        ~
    nothing
        ~

如果我删除我得到的 tildas

Thecatsatonthemat

然后在我看来(而且我对这个 XSLT 东西很陌生),在新行中包含一个 tilda 正在强制新行。

那么,我怎样才能强制模板的输出都在一行上呢?(我的最终要求是对元素进行更多格式化,并用空格来填充元素 - 我稍后会谈到)。

感谢期待

4

3 回答 3

3

改变你~<xsl:text>~</xsl:text>

于 2013-02-06T10:29:11.347 回答
1

发生这种情况的原因是,当非空白文本直接出现在 anxsl:template及其内部元素之间时,非空白所属的所有文本都包含在结果中(包括任何空白)。为避免这种情况,您应该这样做:

<xsl:template match="word1">
    <xsl:value-of select="concat(text(), '~')" />
</xsl:template>

我还建议消除那些几乎相同的 word1、word2 等模板,并用单个模板替换它们:

<xsl:template match="*[starts-with(name(), 'word')]">
    <xsl:value-of select="concat(text(), '~')" />
</xsl:template>
于 2013-02-06T10:31:05.000 回答
0

<xsl:value-of select="text()" />只需删除和之间的换行符~对我有用

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

  <xsl:output indent="no" />
  <xsl:template match="text()[not(string-length(normalize-space()))]"/>
  <xsl:strip-space elements="*"/>

  <xsl:template match="/">
    <xsl:text>&#xa;</xsl:text>
    <xsl:apply-templates />
  </xsl:template>

  <xsl:template match="/root/sentence">
    <xsl:apply-templates />
    <xsl:text>&#xa;</xsl:text>
  </xsl:template>

  <xsl:template match="word1">
    <xsl:value-of select="text()" />~</xsl:template>

  <xsl:template match="word2">
    <xsl:value-of select="text()" />~</xsl:template>

  <xsl:template match="word3">
    <xsl:value-of select="text()" />~</xsl:template>

  <xsl:template match="word4">
    <xsl:value-of select="text()" />~</xsl:template>

  <xsl:template match="word5">
    <xsl:value-of select="text()" />~</xsl:template>

  <xsl:template match="word6">
    <xsl:value-of select="text()" />~</xsl:template>
</xsl:stylesheet>

结果 :

<?xml version="1.0" encoding="utf-8"?>
The~cat~sat~on~the~mat~
The~quick~brown~fox~did~nothing~
于 2013-02-06T13:58:29.207 回答