Я работаю над 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']"/>
Как я могу заполнить этот атрибут динамически?
Спасибо!
ты не можешь просто за-каждый над/Record/Атрибуты дважды, один раз для имени атрибута, и второй раз для значения атрибута? Являются ли имена в ObjectAttributes такими же, как AttrName в разделе «Атрибуты»? – dash
Это будет работать, но я надеялся сопоставить каждый/Record/Attributes с ObjectAttributes, чтобы гарантировать, что атрибут в записи существует в объекте. – Paul
Справедливо! Следующее выражение XPath должно работать для вас тогда: $ ThisRecord/Attributes/Attr [AttrName = $ ThisAttr]/AttrValue - у вас просто проверка вашего AttrName в другом месте, так как вы хотите сказать, что я нашел attr с дочерним attrName = $ ThisAttr, а затем выберите AttrValue. – dash