Pertanyaan Bisakah saya membangun kueri XPath ini secara dinamis di XSLT?


Saya memiliki dokumen yang terlihat seperti

<root>
    <element>
        <subelement1 />
        <subelement2 />
    </element>
    <element>
        <subelement2 />
        <subelement1 />
    </element>
</root>

Dalam lembar XSLT saya dalam konteks /element[2]/[someNode] Saya ingin mendapatkan angka yang mewakili jarak /element[1]/[someNode] (yaitu, jumlah saudara kandung dari sebelumnya /element1/[someNode]). Misalnya, dalam konteks /element[2]/subelement1 Saya ingin memiliki beberapa cara untuk mendapatkan nomor 2, jarak dari /element[1] untuk /element[1]/subelement2. Saya hanya perlu jarak dari nama node yang diberikan dari contoh pertama <element>.

Secara intuitif saya pikir saya bisa membangun ini seperti

 <xsl:variable name="nodename" select="name()" />
 <xsl:value-of select="/element[1]/$nodename/preceding-sibling::*" />

tapi sayangnya sheet ini tidak bisa dikompilasi. Apakah yang saya coba capai mungkin di XSLT?


6
2018-03-21 06:18


asal


Jawaban:


  1. Anda tidak dapat menggunakan variabel XSLT sebagai sumbu dari pernyataan XPATH, tetapi Anda dapat menggunakannya dalam filter predikat. Jadi, jika Anda cocok dengan elemen apa pun (mis. *) lalu batasi ke elemen yang namanya () sama dengan nilai yang disimpan dalam variabel Anda (mis. *[name()=$nodename]) XPATH akan berlaku.

  2. XPATH yang Anda buat akan mengembalikan nilai elemen yang cocok. Jika Anda ingin mengembalikan berapa banyak elemen yang cocok dengan pola itu, Anda dapat menggunakan count() fungsi.

  3. Contoh XML Anda memiliki elemen dokumen <root>, tetapi XPATH Anda tidak termasuk <root>.

Ini mengembalikan jumlah elemen saudara-saudara sebelumnya menggunakan variabel yang ditetapkan oleh simpul konteks:

<xsl:variable name="nodename" select="name()" />
<xsl:value-of select="count(/root/element[1]/*[name()=$nodename]/preceding-sibling::*)" />

Anda dapat menghilangkan variabel dan hanya menggunakan:

<xsl:value-of select="count(/root/element[1]/*[name()=name(current())]/preceding-sibling::*)" />

8
2018-03-21 13:14



*[name() = $nodename] mungkin apa yang Anda inginkan, bukan $nodename tetapi Anda sebaiknya menentukan dua variabel dengan nilai local-name () dan namespace-uri () dan periksa mis. *[local-name() = $localname and namespace-uri() = $namespaceuri] untuk memiliki cara namespace yang aman untuk memilih elemen.


1
2018-03-21 12:34



Membangun xpath sayangnya tidak mungkin. XPaths dikompilasi secara statis; Anda tidak dapat menghasilkan mereka dengan cepat (atau jika Anda melakukannya, mereka hanya string dan tidak dapat dieksekusi).

Namun, apa kamu bisa lakukan adalah menulis permintaan yang terjadi untuk referensi silang beberapa nilai yang sendiri bersifat dinamis ...


0
2018-03-21 12:35