我有这个XML文件:
<messages>
<text>
See you next <corr form="week">wk</corr>.
</text>
<text>
Are you ready <number form="for">4</number> this <duplicate form="week">weeeek</duplicate> end<mark>?</mark>
</text>
</messages>
,我想用XSLT 1.0把它改成这个:
<file>
<messages>
<node>
<text>See you next </text>
<node>
<text>week</text>
</node>
</node>
</messages>
<messages>
<node>
<text>Are you ready </text>
<node>
<text> for</text>
<node>
<text> this</text>
<node>
<text> week</text>
<node>
<text> end</text>
<node>
<text> ?</text>
</node>
</node>
</node>
</node>
</node>
</node>
</messages>
</file>
在第二个文件中,每次我们到达一个带有"form"属性的标记时,我们必须在它自己的标记中创建一个带有form文本的新节点。
这是我的XSLT,但它不能很好地工作,因为标签不在正确的位置。帮助吗?
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:template match="/">
<xsl:element name="file/messages">
<xsl:for-each select="text">
<xsl:apply-templates/>
</xsl:for-each>
</xsl:element>
</xsl:template>
<!-- here, this doesn't work... -->
<xsl:template match="text">
<node><text>
<xsl:apply-templates/>
</text></node>
</xsl:template>
<xsl:template match="*[@form]">
<!-- gets the tag name -->
<xsl:variable name="attribute" select="local-name()"/>
<node><text>
<!-- print the form text -->
<xsl:if
test="$attribute='corr' or $attribute='number' or $attribute='duplicate'">
<xsl:value-of select="./@form"/>
</text></node>
</xsl:if>
<!-- print the "?" -->
<xsl:if
test="($attribute!='corr' and $attribute!='number' and $attribute!='duplicate'">
<xsl:value-of select="."/>
</text></node>
</xsl:if>
</xsl:template>
</xsl:stylesheet>
如果您确定这是您想要的输出,请尝试以下方法,称为"兄弟递归":
XSLT 1.0
(根据编辑的问题进行编辑)
<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:template match="messages">
<file>
<xsl:apply-templates select="text"/>
</file>
</xsl:template>
<xsl:template match="text">
<message>
<xsl:apply-templates select="node()[1]"/>
</message>
</xsl:template>
<xsl:template match="text/*[@form]">
<node>
<text><xsl:value-of select="@form"/></text>
<xsl:apply-templates select="following-sibling::node()[1]"/>
</node>
</xsl:template>
<xsl:template match="text/text() | text/*[not(@form)]">
<node>
<text><xsl:value-of select="."/></text>
<xsl:apply-templates select="following-sibling::node()[1]"/>
</node>
</xsl:template>
</xsl:stylesheet>
当应用于以下测试输入时:
<messages>
<text>See you next <corr form="week">wk</corr>.</text>
<text>Are you ready <number form="for">4</number> this <duplicate form="week">weeeek</duplicate> end<mark>?</mark></text>
</messages>
结果将是:
<?xml version="1.0" encoding="UTF-8"?>
<file>
<message>
<node>
<text>See you next </text>
<node>
<text>week</text>
<node>
<text>.</text>
</node>
</node>
</node>
</message>
<message>
<node>
<text>Are you ready </text>
<node>
<text>for</text>
<node>
<text> this </text>
<node>
<text>week</text>
<node>
<text> end</text>
<node>
<text>?</text>
</node>
</node>
</node>
</node>
</node>
</node>
</message>
</file>