Динамический атрибут XSLT внутри для каждого - PullRequest
1 голос
/ 07 января 2012

Я работаю над файлом 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 Ответ

3 голосов
/ 07 января 2012

Вы можете сослаться на текущий узел контекста с помощью current():

<xsl:value-of 
    select="$ThisRecord/Attributes/Attr[AttrName=current()/Name]/AttrValue"/>

. Следует отметить, что ваш подход к переменной будет иметь сработало без кавычек вокругссылка на переменную в AttrName='$ThisAttr'.Вы буквально сопоставляете строку $ThisAttr (т.е. не ссылаетесь ни на одну переменную);Вы должны были использовать AttrName=$ThisAttr (без кавычек).

Тем не менее, использование current() является лучшим решением.

(Обратите внимание, что я также переставил шаги выражения так, чтобы не требовалось возврата назад).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...