使用基于另一个节点的属性的属性值选择节点

时间:2017-05-19 13:22:08

标签: xml xslt

我是XSLT的新手,我想选择

biblioteka/ksiazki/ksiazka/tytul

基于

biblioteka/osoby/osoba/wypozyczenie[@idKsiazki]

换句话说:根据ksiazka[@id=@idKsiazki]/tytul中的@idKsiazki查找wypozyczenie。 我不能使用静态值例如'hp1',因为我在<xsl:foreach>@idKsiazki中进行了更改。

然而,我试图在这里找到答案,但没有人真的有帮助。 这是我的xml代码:

    <?xml version="1.0" encoding="utf-8"?>
<biblioteka>
    <osoby>
        <osoba plec="M">
            <imie>Karol</imie>
            <nazwisko>Karolowski</nazwisko>
            <adres>
                <miejscowosc>Kołczygłowy</miejscowosc>
                <ulica>Pomorska</ulica>
                <nr-domu>5</nr-domu>
                <kod-pocztowy>76-200</kod-pocztowy>
            </adres>
            <dane_kontaktowe>
                <tel-stac>123412312</tel-stac>
                <tel-kom>213214321</tel-kom>
                <e-mail>gfdfd@gmail.com</e-mail>
            </dane_kontaktowe>
            <konto>
                <login>KKarolowski</login>
                <haslo>123</haslo>
            </konto>
            <wypozyczenie idKsiazki="prj2">
                <dataWypozyczenia>2014-04-08</dataWypozyczenia>
                <dataZwrotu>2014-04-10</dataZwrotu>
            </wypozyczenie> 
        </osoba>
        <osoba plec="K">
            <imie>Marlena</imie>
            <nazwisko>Marlenowska</nazwisko>
            <adres>
                <miejscowosc>Białystog</miejscowosc>
                <ulica>Szybka</ulica>
                <nr-domu>99</nr-domu>
                <kod-pocztowy>76-200</kod-pocztowy>
            </adres>
            <dane_kontaktowe>
                <tel-stac>213214321</tel-stac>
                <tel-kom>123412312</tel-kom>
                <e-mail>gfdfd@gmail.com</e-mail>
            </dane_kontaktowe>
            <konto>
                <login>MMarlenowska</login>
                <haslo>123</haslo>
            </konto>
            <wypozyczenie idKsiazki="hp1">
                <dataWypozyczenia>2014-04-08</dataWypozyczenia>
                <dataZwrotu>2014-04-10</dataZwrotu>
            </wypozyczenie> 
        </osoba>
    </osoby>
    <ksiazki>
        <ksiazka oprawa="twarda" id="hp1">
            <tytul>Harry Potter i Książę Półkrwi</tytul>
            <autor>Joanne K. Rowling</autor>
            <opis>Po nieudanej próbie przechwycenia przepowiedni Lord</opis>
            <id>hp1</id>
        </ksiazka>
        <ksiazka oprawa="twarda" id="asm5">
            <tytul>Programowanie Asembler IBM PC</tytul>
            <autor>Peter Abel</autor>
            <opis>Ta książka jest zarówno podręcznikiem</opis>
            <id>asm5</id>
        </ksiazka>
        <ksiazka oprawa="miekka" id="lond1">
            <tytul>Londyn - przewodnik</tytul>
            <autor>Kathleen Becker</autor>
            <opis>Z przewodnikiem z nowej serii "Marco Polo"</opis>
            <id>lond1</id>
        </ksiazka>
        <ksiazka oprawa="miekka" id="prajav2">
            <tytul>Programowanie obiektowe i zdarzeniowe w Javie</tytul>
            <autor>Krzysztof Barteczko</autor>
            <opis>W książce przedstawiono</opis>
            <id>prjav2</id>
        </ksiazka>
        <ksiazka oprawa="twarda" id="kldv3">
            <tytul>Kod Leonarda da Vinci</tytul>
            <autor>Dan Brown</autor>
            <opis>W Luwrze zostaje popełnione morderstwo.</opis>
            <id>kldv3</id>
        </ksiazka>
    </ksiazki>
</biblioteka>

编辑: 那里的“Nazwa”应该是书名。 输出应该是(在HTML中):

Karol Karolowski
Wypozyczone ksiazki:
Nazwa:Harry Potter i Książę Półkrwi
Data wypozyczenia:2014-04-08
Data zwrotu:2014-04-10
//if more books are rent
Nazwa:...
Data wypozyczenia:...
Data zwrotu:...

这是我的XSLT:

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

<xsl:key name="ksiazka-by-id" match="ksiazka" use="@id" />

<xsl:template match="/">
<xsl:text disable-output-escaping='yes'>&lt;!DOCTYPE html&gt;</xsl:text>
<html>
<head></head>
<body>
  <h2>Biblioteka</h2>

    <xsl:for-each select="biblioteka/osoby/osoba">

<div><br />
      <xsl:value-of select="imie"/>&nbsp;
      <xsl:value-of select="nazwisko"/>
      <p>Wypozyczone ksiazki:</p>

Nazwa: //here the book name

      <br/>
      Data Wypozyczenia: <xsl:value-of select="wypozyczenie/dataWypozyczenia"/><br />
      Data Zwrotu: <xsl:value-of select="wypozyczenie/dataZwrotu"/>
     </xsl:for-each>
</div>

</body>
</html>
</xsl:template>
</xsl:stylesheet>

1 个答案:

答案 0 :(得分:0)

XSLT具有内置的 a Button constructor overload 机制来解决交叉引用。这是一个简化的例子:

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:strip-space elements="*"/>

<xsl:key name="ksiazka-by-id" match="ksiazka" use="@id" />

<xsl:template match="/biblioteka">
    <result>
        <xsl:for-each select="osoby/osoba">
            <xsl:copy>
                <xsl:copy-of select="@plec | imie | nazwisko"/>
                <lookup>
                    <xsl:for-each select="wypozyczenie">
                        <xsl:copy-of select="key('ksiazka-by-id', @idKsiazki)/tytul"/>
                    </xsl:for-each>
                </lookup>
            </xsl:copy>
        </xsl:for-each>
    </result>
</xsl:template>

</xsl:stylesheet>

应用于您的输入示例,结果将是:

<result>
  <osoba plec="M">
    <imie>Karol</imie>
    <nazwisko>Karolowski</nazwisko>
    <lookup/>
  </osoba>
  <osoba plec="K">
    <imie>Marlena</imie>
    <nazwisko>Marlenowska</nazwisko>
    <lookup>
      <tytul>Harry Potter i Książę Półkrwi</tytul>
    </lookup>
  </osoba>
</result>