Нужен XSLT для многострочного товара - PullRequest
0 голосов
/ 26 марта 2012

Я уже много чего пробовал здесь при переполнении стека, но я все еще сталкиваюсь с той же проблемой.

Позвольте мне попытаться объяснить мою проблему и то, что мне нужно достичь.Для этого у меня есть следующий XML:

<authorizationGroups>               
<authorizationGroup>            <!-- can be multiple -->
    <name>OGroup 1</name>
    <application>               <!-- can be multiple -->
        <uid>646</uid>
        <applicationFunctions>  <!-- can be multiple -->
            <name>auth function 11</name>
            <name>auth function 12</name>
        </applicationFunctions> 
    </application>
    <role>5000682864</role>
    <role>5000685391</role>
</authorizationGroup>
<authorizationGroup>            <!-- can be multiple -->
    <name>OGroup 8</name>
    <application>               <!-- can be multiple -->
        <uid>646</uid>
        <applicationFunctions>  <!-- can be multiple -->
            <name>auth function 13</name>
            <name>auth function 14</name>
        </applicationFunctions> 
    </application>
    <role>5000683374</role>
    <role>5000685391</role>
</authorizationGroup>

Мне нужно получить что-то вроде этого:

<resource-types>
<resource-types>
        <resource-type>
                <name>OGroup 1</name>
                <actions>    
            auth function 11,
            auth function 12 
                </actions>
    </resource-type>
        <resource-type>
            <name>OGroup 8</name>
                <actions>   
            auth function 13,
            auth function 14  
                </actions>
        </resource-type>
</resource-types>

Моя проблемачто, когда я использую XSLT, я всегда получаю все «auth functions xx» в одном.

Мой текущий фрагмент кода выглядит так (очевидно, что это не только эта часть):

       <resource-types>
            <xsl:call-template name="resource_types"/>
        </resource-types>
<xsl:template name="resource_types">
    <resource-types>
        <xsl:for-each select="/authorizationGroups/authorizationGroup/name">
            <resource-type>
                <name>
                    <xsl:value-of select="text()"/>
                </name>
                <actions>

                    <xsl:for-each select="/authorizationGroups/authorizationGroup/application/applicationFunctions">
                        <xsl:value-of select=".//text()"/>
                        ,
                    </xsl:for-each>    
                </actions>
            </resource-type>
        </xsl:for-each>
    </resource-types>    
</xsl:template>

Теперь я получаю все "функции аутентификации xx" за один раз.Мое понимание XSLT ограничено, поэтому мой главный вопрос - как я могу ограничить поиск той частью XML-документа, в которой я нахожусь.

Я предположил, что это было очень легкое действие, но после трехдней исследования сети и переполнения стека я не нашел ответа.

у.е. Андреас

Ответы [ 2 ]

0 голосов
/ 26 марта 2012

Проблема, я думаю, в том, что вы перебираете имя элементов, вот так ...

<xsl:for-each select="/authorizationGroups/authorizationGroup/name">

Однако, когда вы приходите, чтобы получить функции приложения в пределах этого xsl: for-each , вы делаете это ...

<xsl:for-each  
   select="/authorizationGroups/authorizationGroup/application/applicationFunctions">

Из-за прямой косой черты в начале выражения получаются все applicationFunctions относительно корня документа, а не authorizationGroup , в которой вы сейчас находитесь.

Что вам нужно сделать, это ...

<xsl:for-each select="../application/applicationFunctions">

Знак .. должен получить родительский элемент, поскольку в данный момент вы находитесь на элементе name , который находится на том же уровне, что и элемент application .

На самом деле, было бы немного лучше, если бы сначала было перебрать authorizationGroup , чтобы начать с

<xsl:for-each select="/authorizationGroups/authorizationGroup">

И затем перебираем функции приложения , вот так

<xsl:for-each select="application/applicationFunctions">
0 голосов
/ 26 марта 2012

Либо заключить разрыв строки в <xsl:text> как (не проверено):

                    <xsl:for-each select="/authorizationGroups/authorizationGroup/application/applicationFunctions">
                        <xsl:value-of select=".//text()"/>
                        <xsl:text>,
</xsl:text>
                    </xsl:for-each>    

или включите его как escape в <xsl:value-of> как (не проверено):

                        <xsl:value-of select="concat(.//text(), ',&#10;')"/>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...