Xml 使用XSL将属性移动到子元素
我有个无法解决的问题。下面是我所拥有的xml结构的一个片段:Xml 使用XSL将属性移动到子元素,xml,xslt,Xml,Xslt,我有个无法解决的问题。下面是我所拥有的xml结构的一个片段: <body> <tu creationdate="01022015" creationid="author1" changedate="02022015" changeid="author2"> <tuv xml:lang="it-IT"> <seg>Questo è testo</seg>
<body>
<tu creationdate="01022015" creationid="author1" changedate="02022015" changeid="author2">
<tuv xml:lang="it-IT">
<seg>Questo è testo</seg>
</tuv>
<tuv xml:lang="en-GB">
<seg>This is a test</seg>
</tuv>
<tuv xml:lang="de-DE">
<seg>Das ist ein Test</seg>
</tuv>
</tu>
<tu>
</tu>
</body>
</tmx>
奎斯托
这是一个测试
Das ist ein测试
我希望在不覆盖任何内容的情况下将所有属性从元素移动到子元素。大概是这样的:
<body>
<tu>
<tuv xml:lang="it-IT" creationdate="01022015" creationid="author1" changedate="02022015" changeid="author2">
<seg>Questo è testo</seg>
</tuv>
<tuv xml:lang="en-GB" creationdate="01022015" creationid="author1" changedate="02022015" changeid="author2">
<seg>This is a test</seg>
</tuv>
<tuv xml:lang="de-DE" creationdate="01022015" creationid="author1" changedate="02022015" changeid="author2">
<seg>Das ist ein Test</seg>
</tuv>
</tu>
<tu>
</tu>
</body>
</tmx>
奎斯托
这是一个测试
Das ist ein测试
这是我迄今为止最好的尝试:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:fo="http://www.w3.org/1999/XSL/Format">
<xsl:output method="xml" indent="yes"/>
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="body/tu/tuv">
<xsl:copy>
<xsl:apply-templates select="../@*|node()"/>
<xsl:apply-templates select="node()"/>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
但不幸的是,这总是覆盖元素中的xml:lang属性。
有什么建议吗
先谢谢你
恩里科
这总是覆盖元素中的xml:lang属性
它不会覆盖它。您只是没有在xsl:apply templates
指令中包含现有属性(尽管您包含了node()
两次,从而复制了所有子元素)
此外,为了获得所需的结果,还必须从父tu
元素中删除属性
试着这样做:
XSLT1.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:strip-space elements="*"/>
<!-- identity transform -->
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="tu/@*"/>
<xsl:template match="tuv">
<xsl:copy>
<xsl:copy-of select="../@*"/>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
注意使用
xsl:copy of
添加属性。这是因为在我们添加了与之匹配的空模板之后,使用xsl:apply templates
不会有任何作用。非常感谢,它现在可以工作了!我是个新手,我刚刚学到了一些新东西:)