说我是否有一些带有如下行的XML:
<machine center="10" left="25" right="162" />
并且,使用XSLT,我希望将其转换为:
<measurement type="center">10</measurement>
<measurement type="left">25</measurement>
<measurement type="right">162</measurement>
我该怎么做?目前我有以下内容,但缺少一个关键部分:
<measurement>
<xsl:for-each select="@">
<xsl:attribute name="type">
<xsl:value-of name="name()">
</xsl:attribute name="type">
<xsl:value-of name="[WHAT_GOES_HERE?]" />
</xsl:for-each>
</measurement>
答案 0 :(得分:3)
以这种方式试试;
<xsl:template match="machine">
<xsl:for-each select="@*">
<measurement type="{name()}">
<xsl:value-of select="." />
</measurement>
</xsl:for-each>
</xsl:template>
答案 1 :(得分:1)
实现这一目标的方法是:
<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="machine">
<xsl:for-each select="@*">
<xsl:element name="measurement">
<xsl:attribute name="type">
<xsl:value-of select="local-name()" />
</xsl:attribute>
<xsl:value-of select="." />
</xsl:element>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>
答案 2 :(得分:0)
这个解决方案是:更简单/更短,避免<xsl:for-exch>
并且完全符合XSLT的精神:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:template match="machine">
<xsl:apply-templates select="@*"/>
</xsl:template>
<xsl:template match="machine/@*">
<measurement type="{name()}"><xsl:value-of select="."/></measurement>
</xsl:template>
</xsl:stylesheet>
在提供的XML文档上应用此转换时:
<machine center="10" left="25" right="162" />
产生了想要的正确结果:
<measurement type="center">10</measurement>
<measurement type="left">25</measurement>
<measurement type="right">162</measurement>