获取属性的值,您不知道名称

时间:2016-02-08 14:18:08

标签: xslt xpath

说我是否有一些带有如下行的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>

3 个答案:

答案 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>