Pertanyaan Mengapa template yang cocok lebih baik tidak dipilih?


Saya memiliki xml berikut:

<root xmlns:s="http://example.com/schema">
  <foo>
     <s:bars>
       <s:bar name="normal">bar101</s:bar>
       <s:bar name="special">Foobar</s:bar>
       <s:bar name="super">FuBar</s:bar>
     </s:bars>
  </foo>
</root>

Saya menggunakan template xslt berikut untuk menampilkan bar elemen:

  <xsl:template match="root">
    <foos>
      <xsl:apply-templates select="foo/s:bars"/>
    </foos>
  </xsl:template>

  <xsl:template match="s:bars/s:bar[@name='special' or @name='super']">
    <xsl:element name="{@name}">
      <xsl:text>special value:</xsl:text>
      <xsl:value-of select="."/>
    </xsl:element>
  </xsl:template>

  <xsl:template match="s:bars/s:bar">
    <xsl:element name="{@name}">
      <xsl:value-of select="."/>
    </xsl:element>
  </xsl:template>

Anehnya ini menghasilkan xml berikut ketika menggunakan. Net XSLT processor:

<foos>
  <normal>bar101</normal>
  <special>Foobar</special>
  <super>FuBar</super>
</foos>

Rupanya template untuk s:bars/s:bar[@name='special' or @name='super'] tidak digunakan. Saya mengharapkan hasil sebagai berikut:

<foos>
  <normal>bar101</normal>
  <special>special value:Foobar</special>
  <super>special value:FuBar</super>
</foos>

Saya mencoba menambahkan template ekstra untuk dipilih bars

  <xsl:template match="s:bars">
    <xsl:comment>bars</xsl:comment>
    <xsl:apply-templates />
  </xsl:template>

tetapi itu tidak mengubah hasilnya (tetapi menambahkan <!--bars--> hingga hasilnya jadi templat dipanggil.)

Sepertinya saya mengharapkan sesuatu yang berbeda dari aturan template atau salah paham. Seharusnya tidak cocok dengan suatu elemen DAN atribut dipilih selama pertandingan HANYA sebuah elemen?

Bagaimana saya harus mengubah template XSLT saya untuk mendapatkan output yang saya inginkan dengan implementasi prosesor .Net XSLT?


4
2018-01-31 11:09


asal


Jawaban:


Kedua template memiliki prioritas yang sama 0.5 (Lihat http://www.w3.org/TR/xslt#conflict) sehingga prosesor XSLT dapat melaporkan kesalahan atau mengambil yang terakhir. Jika Anda tidak mendapatkan kesalahan maka prosesor XSLT Anda telah mengambil aturan template pencocokan terakhir. Jadi ubah urutan atau tetapkan prioritas eksplisit (mis. <xsl:template match="s:bars/s:bar[@name='special' or @name='super']" priority="5">) pada yang Anda ingin lebih disukai.


2
2018-01-31 12:10