如何通过属性值更改元素/标记值?

时间:2014-06-20 21:27:08

标签: xml xslt treeview xslt-1.0

我有一个包含很长标签列表的XML代码,我希望在每个元素中替换#34; text"里面的单词和标签由他们各自的"形式"属性值。

例如,这是我的XML文件中的两句话:

<messages>
    <text>
        <spelling form="Hello">Helo</spelling> I'll see you next <abrev form="week">wk</abrev> alright.
    </text>
    <text>
        <abrev form="Come on">cmon</abrev> get ready <spelling form="dude">dood</spelling>!
    </text>
</messages>

这是我正在寻找的输出:

Hello I'll see you next week alright.
Come on get ready dude!

有没有人知道如何做到这一点?


以下是我目前在XSL文件中的内容:

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">

    <xsl:for-each select="messages/text">

        <xsl:call-template name="parse">

            <!-- this selects all the tags inside "text" (I think...) -->
            <xsl:with-param name="a" select="./*"/>

        </xsl:call-template>

    </xsl:for-each>
</xsl:template>

然后,我的功能&#34;解析&#34;:

<xsl:template name="parse">

    <!-- "a" is the text to parse -->
    <xsl:param name="a"/>

    <!-- return the value of "form" -->
    <xsl:value-of select="$a/@form"/>

</xsl:template>

现在,我的功能&#34;解析&#34;还没有完成。我不知道如何用他们的&#34;表格替换拼写错误的单词&#34;值。

感谢您的帮助!

2 个答案:

答案 0 :(得分:1)

假设您的文本中可能同时包含<abrev><spelling>元素(实际上任何一个具有form属性的元素),并且您的真实XML格式正确,此样式表可以用于将标记文本替换为form属性中的值:

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">

    <xsl:output method="text"/>

    <xsl:template match="/">
        <xsl:apply-templates  select="messages/text"/>
    </xsl:template>

    <xsl:template match="text/*[@form]">
        <xsl:value-of select="@form"/>
    </xsl:template>
</xsl:stylesheet>

如果您将其应用于此输入:

<messages>
    <text>
        <spelling form="Hello">Helo</spelling> I'll see you next <abrev form="week">wk</abrev> alright.
    </text>
    <text>
        <spelling form="Come on">cmon</spelling> get ready <abrev form="dude">dood</abrev>!
    </text>
</messages>

您将获得此输出:

    Hello I'll see you next week alright.

    Come on get ready dude!

答案 1 :(得分:1)

您可以从身份模板开始,然后从中为每个元素创建模板,以便您可以控制其特定输出。例如,让text元素输出其文本,同时运行spellingabrev元素的模板,这些元素输出其@form属性。

所以看起来如下所示。

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

  <xsl:template match="messages">
    <xsl:apply-templates/>
  </xsl:template>

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

  <xsl:template match="spelling">
    <xsl:value-of select="@form"/>
  </xsl:template>

  <xsl:template match="abrev">
    <xsl:value-of select="@form"/>
  </xsl:template>