XSLT document () не вызывает определенные c узлы - PullRequest
0 голосов
/ 16 апреля 2020

Я пытаюсь вызвать узел 'firstName' в моем коде xsl, однако, когда я пытаюсь вызвать 'value-of select = "firstName', он, кажется, не работает и после преобразования он ничего не отображает

Мой xsl-код:

<?xml version="1.0"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

    <xsl:variable name="customers" select="document('customer.xml')/customers"/>

    <xsl:template match="/">
        <xsl:copy>
            <xsl:for-each select="transactions/transaction">
                <xsl:sort select="giftShop"/>
                <xsl:sort select="transaction_date"/>
                Shop: <xsl:value-of select="giftShop"/>
                Date: <xsl:value-of select="transaction_date"/>
                <xsl:for-each select="$customers">
                    <xsl:value-of select="."/>
                </xsl:for-each>
            </xsl:for-each>
        </xsl:copy>
    </xsl:template>

</xsl:stylesheet>

транзакций. xml (первый xml файл):

<?xml version="1.0"?>
<transactions>
    <transaction>
        <transaction_date>01/11/2019</transaction_date>
        <customerID>8BLOJZWL</customerID>
        <giftShop>1</giftShop>
        <transactionID>BjYAtd7lmEOlQUVy</transactionID>
        <value currency="gbp">149.99</value>
    </transaction>
    <transaction>
        <transaction_date>01/11/2019</transaction_date>
        <customerID>DR18OCFI</customerID>
        <giftShop>2</giftShop>
        <transactionID>aQ27lMvfnlzY4mkx</transactionID>
        <value currency="gbp">100.11</value>
    </transaction>
<transaction>

покупатель. xml (второй xml файл):

<?xml version="1.0"?>
<customers>
    <customer>
        <prefix>Mrs</prefix>
        <lastName>Samantha</lastName>
        <givenName>Smith</givenName>
        <addressID>213456</addressID>
        <customerID>ASJ4OTLG</customerID>
    </customer>
    <customer>
        <prefix>Mr </prefix>
        <lastName>Cameron</lastName>
        <givenName>Wills</givenName>
        <addressID>125907</addressID>
        <customerID>SID8RY23</customerID>
    </customer>
</customers>

Ожидаемый результат: Также извините, если мой ожидаемый результат не очень точен, я очень плохо знаком с xml и xsl

<giftShop>
    <transaction_date>
        <transacation>
            <customer>

Я пытаюсь вызвать конкретный c «данные клиента», но в данный момент он отображает все данные и продолжает сбой моего Блокнота ++, когда я пытаюсь закрыть файл.

Любая помощь очень ценится !! 1017 *

Ответы [ 2 ]

0 голосов
/ 16 апреля 2020

Я предполагаю (!), Что вы хотите сделать что-то вроде этого:

XSLT 1.0

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="text"/>

<xsl:variable name="customers" select="document('retail_customer.xml')/customers"/>

<xsl:template match="/transactions">
    <xsl:for-each select="transaction">
        <xsl:sort select="giftShop"/>
        <xsl:sort select="transaction_date"/>
        <xsl:text>Shop: </xsl:text>
        <xsl:value-of select="giftShop"/>
        <xsl:text>&#10;Date: </xsl:text>
        <xsl:value-of select="transaction_date"/>
        <xsl:variable name="customer" select="$customers/customer[customerID=current()/customerID]"/>
        <xsl:text>&#10;Customer: </xsl:text>
        <xsl:value-of select="$customer/lastName"/>
        <xsl:text> </xsl:text>
        <xsl:value-of select="$customer/givenName"/>
        <xsl:text>&#10;&#10;</xsl:text>
    </xsl:for-each>
</xsl:template>

</xsl:stylesheet>

Конечно, это может работать только если у транзакции есть соответствующий клиент в другом документе. В вашем примере их нет.


PS Обратите внимание, что <xsl:sort select="transaction_date"/> не будет работать правильно в вашем случае, потому что ваши даты в DD/MM/YYYY (или MM/DD/YYYY? ) и сортировка их по алфавиту не приведет к хронологическому порядку. Но это отдельный вопрос (и вы можете найти ответ здесь: { ссылка }).

0 голосов
/ 16 апреля 2020

Поскольку переменная вашего документа уже ссылается на «клиентов»

<xsl:variable name="customers" select="document('customer.xml')/customers"/>

Когда вы делаете для l oop

<xsl:for-each select="$customers">
  <xsl:value-of select="."/>
</xsl:for-each>

Вы должны делать что-то вроде этого

<xsl:for-each select="$customers/customer">
  <xsl:value-of select="customerID"/> <!-- Or whichever node you want -->
</xsl:for-each>
...