2009-12-16 8 views
0

я в настоящее время есть документ XML, как это:Фильтрация XSL: стоимость из атрибутов

<?xml version="1.0" encoding="ISO-8859-1"?> 
<?xml-stylesheet type="text/xsl" href="./transform.xsl"?> 
<Documentation><Tables> 
<TABLE TABLE_NAME="FirstTable"> 
    <COLUMN COLUMN_NAME="FirstColumn" ORDINAL_POSITION="1" IS_NULLABLE="NO" DATA_TYPE="int" /> 
    <COLUMN COLUMN_NAME="SecondColumn" ORDINAL_POSITION="2" IS_NULLABLE="NO" DATA_TYPE="int" /> 
</TABLE> 

... 

</Tables><Comments> 
<COMMENT ForTable="FirstTable" ForColumn="FirstColumn">Description of FirstColumn</COMMENT> 
</Comments></Documentation> 

Мой вопрос, как я могу получить значение КОММЕНТАРИЯ, когда цикл над таблицами и столбцами? У меня есть:

<xsl:for-each select="//TABLE"> 
    ... 
    <xsl:for-each select="COLUMN"> 
    ... 
    <xsl:value-of select="//COMMENT[@ForTable = @TABLE_NAME and @[email protected]_NAME]" /> 

Но это не работает. Любой совет?

ответ

1

Другой вариант, чтобы решить это было бы:

<xsl:for-each select="/Documentation/Tables/TABLE"> 
    <!-- select all comments for the current table name… --> 
    <xsl:variable name="$comments" select=" 
    /Documentation/Comments/COMMENT[@ForTable = current()/@TABLE_NAME] 
    "/> 

    <xsl:for-each select="COLUMN"> 
    <!-- …of those, select the one with the current column name --> 
    <xsl:value-of select=" 
     $comments[@ForColumn = current()/@COLUMN_NAME] 
    " /> 
    </xsl:for-each> 
</xsl:for-each> 

Преимущества:

  • вам нужно только одну переменную, а не два
  • внутренний для каждого может работать быстрее, так как он смотрит как Maller, предварительно фильтруется набор данных

Обратите внимание, что:

  • Я использую current() для обозначения контекста XSLT-узла в пределах XPath предикатов.
  • Я избегаю // в выражениях XPath, так как он имеет очень плохие рабочие характеристики и не должен использоваться, если это возможно. Структура входного документа подразумевает, что // не требуется.
+0

Спасибо, я в конечном итоге, используя свое решение без переменной: Todd

+0

Обратите внимание, что это, вероятно, менее эффективно, но для небольших входных документов оно является академическим. – Tomalak

2

Это не работает, потому что выбор значения имеет значение «получить значение всех комментариев, чей атрибут ForTable имеет то же значение, что и атрибут TABLE NAME, а атрибут ForColumn имеет то же значение, что и атрибут COLUMN NAME», ,

Try что-то вроде

<xsl:for-each select="//TABLE"> 
    <xsl:variable name="table_name" select="@TABLE_NAME"/> 
    ... 
    <xsl:for-each select="COLUMN"> 
     <xsl:variable name="column_name" select="@COLUMN_NAME"/> 
     ... 
     <xsl:value-of select="//COMMENT[@ForTable=$table_name and @ForColumn=$column_name]" /> 
Смежные вопросы