Применение шаблона в XSLT и не работает - PullRequest
0 голосов
/ 05 апреля 2019

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

Я попытался упростить его и переместил apply-templatesтолько 1 для каждого и там я получил его на работу.

Это мой пример ввода xml:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<getPartMasterDataCompleteResponse >
    <result>
        <partMasterDataCompletes>
            <partMasterDataComplete>
                <part>A0001506450</part>
                <version>11</version>
                <partMasterData>
                    <language>german</language>
                    <part>A1234567890</part>
                    <releaseDateFrom>2018-09-06T08:52:18+02:00</releaseDateFrom>
                    <testTag>
                        <test></test>
                        <test></test>
                        <test></test>
                    </testTag>
                </partMasterData>
            </partMasterDataComplete>
        </partMasterDataCompletes>
    </result>
</getPartMasterDataCompleteResponse>

Это xslt, который я использую:

<?xml version="1.0"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:template match="getPartMasterDataCompleteResponse/result/partMasterDataCompletes">
        <xsl:for-each select="partMasterDataComplete">
            <Part>
                <UserData>
                    <xsl:for-each select="partMasterData/*">
                        <xsl:if test="not(*)">
                            <xsl:choose>
                                <xsl:when test="local-name() = 'part'">
                                    <xsl:apply-templates select="part"/>
                                </xsl:when>
                                <xsl:otherwise>
                                    <UserValue>
                                        <xsl:attribute name="title">
                                            <xsl:value-of select="local-name()"/>
                                        </xsl:attribute>
                                        <xsl:attribute name="value">
                                            <xsl:value-of select="current()"/>
                                        </xsl:attribute>
                                    </UserValue>
                                </xsl:otherwise>
                            </xsl:choose>
                        </xsl:if>
                    </xsl:for-each>
                </UserData>
            </Part>
        </xsl:for-each>
    </xsl:template>

    <xsl:template match="part">
        <UserValue title="PartNumber">
            <xsl:attribute name="value">
                <xsl:value-of select="current()"/>
            </xsl:attribute>
        </UserValue>
    </xsl:template>

</xsl:stylesheet>

Результат, который я получаю от инструментов онлайн-трансформации:

<Part>
   <UserData>
      <UserValue title="language" value="german"/>
      <UserValue title="releaseDateFrom" value="2018-09-06T08:52:18+02:00"/>
   </UserData>
</Part>

Я ожидал бы:

<Part>
   <UserData>
      <UserValue title="language" value="german"/>
      <UserValue title="PartNumber" value="A0001506450"/>
      <UserValue title="releaseDateFrom" value="2018-09-06T08:52:18+02:00"/>
   </UserData>
</Part>

Любая помощь приветствуется.

Спасибо

1 Ответ

1 голос
/ 05 апреля 2019

Когда вы делаете apply-templates, вы уже позиционируете элемент part, поэтому, делая <xsl:apply-templates select="part"/>, вы фактически ищете дочерний элемент с именем part в текущем элементе. (т. е. на самом деле это то же самое, что и <xsl:apply-templates select="child::part"/>)

Вы хотите применить шаблон к текущему элементу, поэтому сделайте это вместо:

<xsl:apply-templates select="."/>

Или, если вы действительно хотите сделать это явным ...

<xsl:apply-templates select="self::part"/>

Кроме того, вы можете значительно упростить XSLT, улучшив использование xsl:apply-templates и используя шаблоны значений атрибутов для создания атрибутов.

Попробуйте это XSLT

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="xml" indent="yes" />
    <xsl:template match="getPartMasterDataCompleteResponse/result/partMasterDataCompletes">
        <xsl:for-each select="partMasterDataComplete">
            <Part>
                <UserData>
                    <xsl:apply-templates select="partMasterData/*[not(*)]" />
                </UserData>
            </Part>
        </xsl:for-each>
    </xsl:template>

    <xsl:template match="partMasterData/*">
        <UserValue title="{local-name()}" value="{current()}" />
    </xsl:template>

    <xsl:template match="part">
        <UserValue title="PartNumber" name="{current()}" />
    </xsl:template>
</xsl:stylesheet>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...