无法使用XSLT访问XML文件中的隔离文本

时间:2016-06-13 09:26:45

标签: xml xslt xpath

我已经问过question与此有关,但我认为我不会面临另一个问题。这是我的示例XML文件:

<section>
    Hello everyone, I'm
    <bold>Hackmania</bold>
    <bold>15</bold>
    <line/>
    I am looking for an
    <highlight>answer</highlight>
    <paragraph/>

    Here is an other
    <bold>paragraph</bold>
    <highlight>with the same tags</highlight>
    <paragraph/>
</section>

我怎样才能将我的孤立文本放入特定标签中,让我们说<myText></myText>?像这样:

<section>
    <p>
        <myText>Hello everyone, I'm</myText>
        <bold>Hackmania</bold>
        <bold>15</bold>
        <line/>
        <myText>I am looking for an</myText>
        <highlight>answer</highlight>
    </p>
    <p>
        <myText>HHere is an other</myText>
        <bold>paragraph</bold>
        <highlight>with the same tags</highlight>
    </p>
</section>

提前感谢您的帮助。

1 个答案:

答案 0 :(得分:1)

而不是

    <xsl:for-each select="paragraph">
        <p>
            <xsl:copy-of select="key('grpById', generate-id())"/>
        </p>
    </xsl:for-each>

在引用的解决方案中,您可以使用

    <xsl:for-each select="paragraph">
        <p>
            <xsl:apply-templates select="key('grpById', generate-id())"/>
        </p>
    </xsl:for-each>

然后确保你做

<xsl:template match="section/text()">
  <myText>
    <xsl:value-of select="normalize-space()"/>
  </myText>
</xsl:template>

加上身份转换模板

<xsl:template match="@* | node()">
  <xsl:copy>
    <xsl:apply-templates select="@* | node()"/>
  </xsl:copy>
</xsl:template>

将其余部分复制不变。

那么整个样式表就是

<xsl:stylesheet version="1.0" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
    <xsl:strip-space elements="*"/>

    <xsl:key name="grpById" match="node()[not(self::paragraph)]" use="generate-id(following-sibling::paragraph[1])" />

    <xsl:template match="@* | node()">
        <xsl:copy>
            <xsl:apply-templates select="@* | node()"/>
        </xsl:copy>
    </xsl:template>

    <xsl:template match="section/text()">
        <myText>
            <xsl:value-of select="normalize-space()"/>
        </myText>
    </xsl:template>

    <xsl:template match="/section">
        <xsl:copy>
            <xsl:for-each select="paragraph">
                <p>
                    <xsl:apply-templates select="key('grpById', generate-id())"/>
                </p>
            </xsl:for-each>
        </xsl:copy>
    </xsl:template>

</xsl:stylesheet>