我是XSLT编程的新手,请大家帮我解决下面的请求?
这就是它
<File attrib1="100" attrib2="200">
<FileHeader attrib3="a" attrib4="5">
<item attrib5="34" attrib6="3">
<subitem1/>
<subitem2/>
</item>
<item attrib5="156" attrib6="170">
<subitem1/>
<subitem2/>
</item>
</FileHeader>
</File>
我想将其转换为
<File attrib1="100" attrib2="200">
<item attrib5="34" attrib6="3">
<subitem1/>
<subitem2/>
</item>
<item attrib5="156" attrib6="170">
<subitem1/>
<subitem2/>
</item>
<FileHeader attrib3="a" attrib4="5">
</FileHeader>
</File>
下面是我写的代码,似乎项目为每个项目重复多次:
<xsl:template match="/">
<File>
<xsl:attribute name="attrib1">
<xsl:value-of select="File/@attrib1"/>
</xsl:attribute>
<xsl:attribute name="attrib2">
<xsl:value-of select="File/@attrib2"/>
</xsl:attribute>
<xsl:for-each select="File/FileHeader/item">
<xsl:copy-of select="//Item[@*]"/>
</xsl:for-each>
<FileHeader>
<xsl:attribute name="attrib3">
<xsl:value-of select="/File/FileHeader/@attrib3"/>
</xsl:attribute>
<xsl:attribute name="attrib4">
<xsl:value-of select="/File/FileHeader/@attrib4"/>
</xsl:attribute>
</FileHeader>
</File>
</xsl:template>
谢谢我想出来,下面的工作正常。
<xsl:template match="/">
<File>
<xsl:attribute name="attrib1">
<xsl:value-of select="File/@attrib1"/>
</xsl:attribute>
<xsl:attribute name="attrib2">
<xsl:value-of select="File/@attrib2"/>
</xsl:attribute>
<xsl:copy-of select="//Item[@*]"/>
<FileHeader>
<xsl:attribute name="attrib3">
<xsl:value-of select="/File/FileHeader/@attrib3"/>
</xsl:attribute>
<xsl:attribute name="attrib4">
<xsl:value-of select="/File/FileHeader/@attrib4"/>
</xsl:attribute>
</FileHeader>
</File>
</xsl:template>
答案 0 :(得分:1)
您可以为此编写一个更简单的模板。您无需显式复制属性:
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0">
<xsl:output indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:template match="File">
<xsl:copy>
<xsl:copy-of select="@*|FileHeader/item"/>
<xsl:apply-templates select="FileHeader"/>
</xsl:copy>
</xsl:template>
<xsl:template match="@*|FileHeader">
<xsl:copy>
<xsl:apply-templates select="@*"/>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>