XSL - как выполнить следующий цикл для каждого цикла внутри другого, чтобы связать одинаковые значения из разных узлов xml - PullRequest
0 голосов
/ 03 октября 2019

Я изо всех сил пытаюсь создать Excel с xslt, который будет связывать (объединять) два узла на одном уровне по общему значению атрибута.

Здесь идет ввод xml:

```
<Nodes>
<Item name="ABC" category_id="A"></Item>
<Item name="DEF" category_id="B"></Item>
<Category name="First category" cat_id="A"</Category>
<Category name="Second category" cat_id="B"</Category>
</Nodes>```

И часть xsl:

        <xsl:for-each select="//tc:Nodes/tc:Item">
             <xsl:variable name="item_name" select="./@Name" />
             <xsl:variable name="item_category_id" select="./@category_id" />
             <xsl:for-each select="//tc:Nodes:tc:Category/@cat_id = $category_id">
               <xsl:variable name="category_category_id" select="./@cat_id />
             </xsl:for-each>
             <xsl:call-template name="generateReportData">
               <xsl:with-param name="item_name" select="$item_name"/>
               <xsl:with-param name="item_category_id" select="$item_category_id" />
               **<xsl:with-param name="category_category_id" select="$category_category_id"/>**
             </xsl:call-template>

         </xsl:for-each>

Проблема в том, что я не могу получить доступ к переменной $ category_category_id как говорится, он либо не определен, либо находится вне области видимости.

Результат должен содержать одну строку, содержащую такие значения, как: ABC, A, Первая категория (он свяжет значения из двух узлов по общему идентификатору категории). Пожалуйста, помогите - я новичок в xsl - может быть, есть другой способ сделать это.

С уважением, Люк

1 Ответ

1 голос
/ 04 октября 2019

связать (объединить) два узла на одном уровне по общему значению атрибута.

Лучше всего это сделать с помощью клавиши ,Например:

XML

<Nodes>
    <Item name="ABC" category_id="A"/>
    <Item name="DEF" category_id="B"/>
    <Category name="First category" cat_id="A"/>
    <Category name="Second category" cat_id="B"/>
</Nodes>

XSLT 1.0

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>

<xsl:key name="cat" match="Category" use="@cat_id" />

<xsl:template match="Nodes">
    <Table>
        <xsl:for-each select="Item">
            <Row>
                <Cell>
                    <xsl:value-of select="@name"/>
                </Cell>
                <Cell>
                    <xsl:value-of select="key('cat', @category_id)/@name"/>
                </Cell>
            </Row>
        </xsl:for-each>
    </Table>
</xsl:template>

</xsl:stylesheet>

Результат

<?xml version="1.0" encoding="UTF-8"?>
<Table>
  <Row>
    <Cell>ABC</Cell>
    <Cell>First category</Cell>
  </Row>
  <Row>
    <Cell>DEF</Cell>
    <Cell>Second category</Cell>
  </Row>
</Table>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...