2012-01-06 4 views
1

Я работаю над XSLT-файлом, чтобы преобразовать XML-документ, представляющий таблицу в SQL-команды. XML описывает как столбцы таблицы, и каждую строку данных со следующей структурой:Динамический атрибут XSLT внутри для каждого

<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"/> 

Я попытался заменить его с переменной, но Тхи s не работает:

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

Как я могу заполнить этот атрибут динамически?

Спасибо!

+0

ты не можешь просто за-каждый над/Record/Атрибуты дважды, один раз для имени атрибута, и второй раз для значения атрибута? Являются ли имена в ObjectAttributes такими же, как AttrName в разделе «Атрибуты»? – dash

+0

Это будет работать, но я надеялся сопоставить каждый/Record/Attributes с ObjectAttributes, чтобы гарантировать, что атрибут в записи существует в объекте. – Paul

+1

Справедливо! Следующее выражение XPath должно работать для вас тогда: $ ThisRecord/Attributes/Attr [AttrName = $ ThisAttr]/AttrValue - у вас просто проверка вашего AttrName в другом месте, так как вы хотите сказать, что я нашел attr с дочерним attrName = $ ThisAttr, а затем выберите AttrValue. – dash

ответ

2

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

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

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

Сказанное, используя current() - лучшее решение.

(Обратите внимание, что я также переоформлена шаги экспрессии, так что не требуется откат.)

+0

+1 - избили меня тоже, хотя я собирался использовать переменную, а не текущую() ;-) – dash

+0

Спасибо за советы; вот что я и сделал. Переорганизация тоже была хорошей идеей. – Paul

Смежные вопросы