XSLT:添加多个属性

时间:2017-11-23 16:19:04

标签: xml xslt

我正在尝试将多个属性添加到单个节点中,而无需对名称进行硬编码。 输入xml 如下所示:

<bom>
    <columns>
        <column id="0">Name</column>
        <column id="1">ID</column>
        <column id="2">Description</column>
    </columns>
    <rows>
        <row number="0" level="0" position="">
            <cell column="0">FooName1</cell>
            <cell column="1">1000</cell>
            <cell column="2">FooDescription1</cell>
        </row>
        <row number="1" level="1" position="">
            <cell column="0">FooName2</cell>
            <cell column="1">2000</cell>
            <cell column="2">FooDescription2</cell>
        </row>
        <row number="2" level="1" position="">
            <cell column="0">FooName3</cell>
            <cell column="1">3000</cell>
            <cell column="2">FooDescription3</cell>
        </row>
    </rows>
</bom>

我希望输出xml 看起来像这样:

<xml>
    <Item Name="FooName1"
            ID="1000"
            Description="FooDescription1"
            >
        <BOM>
            <Child Name="FooName2"
            ID="2000"
            Description="FooDescription2"
            />
            <Child Name="FooName3"
            ID="3000"
            Description="FooDescription3"
            />
        </BOM>
    </Item>
</xml>

到目前为止,我的XSLT(版本1.0)看起来像这样:

<?xml version="1.0" encoding="iso-8859-1"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">

  <xsl:output method="xml" version="1.0" indent="yes" encoding="utf-8"/>

  <xsl:template match="bom">
    <impxml>
      <Item>
          <xsl:apply-templates select="columns/column" />
      </Item>
    </impxml>
  </xsl:template>

  <xsl:template match="columns/column">
    <!-- <xsl:value-of select="."/> Fetch all column values -->
    <xsl:for-each select=".">
      <xsl:attribute name="TEST">TEST</xsl:attribute>
    </xsl:for-each>
  </xsl:template>

</xsl:stylesheet>

<xsl:attribute name="">只接受一个硬编码名称。如何遍历columns \ column中的所有值并将它们作为属性添加到同一Item或Child节点?

我是XSLT的新手,所以我很感激这里的任何输入/帮助。谢谢。

1 个答案:

答案 0 :(得分:1)

考虑使用ancestor::*在顶部检索<column>值。然后使用{path}作为动态属性名称,该名称相当于属性之外的<xsl:value-of select="path" />。两者都使用@id匹配相应的@columnxsl:variable值:

<?xml version="1.0" encoding="iso-8859-1"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">

  <xsl:output method="xml" version="1.0" indent="yes" encoding="utf-8"/>

  <xsl:template match="bom">
    <impxml>
          <xsl:apply-templates select="rows/row" />
    </impxml>
  </xsl:template>

  <xsl:template match="rows/row">
      <Item>
          <xsl:apply-templates select="cell" />
      </Item>
  </xsl:template>

  <xsl:template match="cell">
    <xsl:variable name="curr_col"><xsl:value-of select="@column"/></xsl:variable>      
      <xsl:attribute name="{ancestor::bom/columns/column[@id=$curr_col]}">
          <xsl:value-of select="."/> 
      </xsl:attribute>
  </xsl:template>

</xsl:stylesheet>

<强>输出

<impxml>
   <Item Name="FooName1" ID="1000" Description="FooDescription1"/>
   <Item Name="FooName2" ID="2000" Description="FooDescription2"/>
   <Item Name="FooName3" ID="3000" Description="FooDescription3"/>
</impxml>