每个内部的XSLT动态属性

时间:2012-01-06 20:57:19

标签: xml xslt

我正在处理一个XSLT文件,将表示表的XML文档转换为SQL命令。 XML描述了表的列和每行数据,具有以下结构:

<Table>
<ObjectAttributes>
  <AttributeDetail>
    <Name>COLNAME1</Name>
    ...
  </AttributeDetail>
  <AttributeDetail>
    <Name>COLNAME2</Name>
    ...
  </AttributeDetail>
  ...
</ObjectAttributes>
<Record RowID="00001">
  <Attributes>
    <Attr>
      <AttrName>COLNAME1</AttrName>
      <AttrValue>VALUE</AttrValue>
    </Attr>
    <Attr>
      <AttrName>COLNAME2</AttrName>
      <AttrValue>VALUE</AttrValue>
    </Attr>
    ...
  </Attributes>
</Record>
<Record RowID="00002">
  <Attributes>
    <Attr>
      <AttrName>COLNAME1</AttrName>
      <AttrValue>VALUE</AttrValue>
    </Attr>
    <Attr>
      <AttrName>COLNAME2</AttrName>
      <AttrValue>VALUE</AttrValue>
    </Attr>
    ...
  </Attributes>
</Record>
...
</Table>

我编写了以下XSLT来创建INSERT命令:

<xsl:for-each select="/Table/Record">
  <xsl:variable name="ThisRecord" select="."/>
  <Command>
    INSERT INTO <xsl:value-of select="../ObjectName"/>
      (ROWID, 
      <xsl:for-each select="../ObjectAttributes/AttributeDetail">
        <xsl:value-of select="Name"/>
        <xsl:if test="position() != last()">
          <xsl:text>, </xsl:text>
        </xsl:if>
      </xsl:for-each>) 
      VALUES 
      (<xsl:value-of select="@RowID"/>, 
      <xsl:for-each select="../ObjectAttributes/AttributeDetail">
        <xsl:text>'</xsl:text><xsl:value-of select="$ThisRecord/Attributes/Attr/AttrValue[../AttrName='COLNAME1']"/><xsl:text>'</xsl:text>
        <xsl:if test="position() != last()">
          <xsl:text>, </xsl:text>
        </xsl:if>
      </xsl:for-each>)
  </Command>
</xsl:for-each>

这很有效,除了我正在努力弄清楚如何用以下结果替换AttrName =''的值:

<xsl:value-of select="Name"/>

我尝试用变量替换它,但这不起作用:

<xsl:variable name="ThisAttr" select="Name"/>
<xsl:value-of select="$ThisRecord/Attributes/Attr/AttrValue[../AttrName='$ThisAttr']"/>

如何动态填写此属性?

谢谢!

1 个答案:

答案 0 :(得分:3)

您可以使用current()

引用当前上下文节点
<xsl:value-of 
    select="$ThisRecord/Attributes/Attr[AttrName=current()/Name]/AttrValue"/>

我应该注意,你的变量方法 你真的在字符串AttrName='$ThisAttr'上匹配(即没有引用任何变量);你应该使用$ThisAttr(没有引号)。

也就是说,使用AttrName=$ThisAttr是更好的解决方案。

(请注意,我还重新安排了表达式步骤,以便不需要回溯。)