我有一个包含很长标签列表的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;值。
感谢您的帮助!
答案 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
元素输出其文本,同时运行spelling
和abrev
元素的模板,这些元素输出其@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>