özel xml xhtml den xslt dönüşümü

3 Cevap php

Özel bir uygulama için ben (özel) xml xhtml dönüştürmek gerekir. Bazı denemeler sonra ben php5 en XSLT fonksiyonelliğini bir denemeye karar verdi, ama bugüne kadar ben onların xml eşdeğer iç içe p etiketleri dönüştürmek mümkün değilim.

Temelde bu gibi bir kod vardır:

<p>Some text</p>
<ol>
   <li><p>Some more text</p></li>
   ..
</ol>

Bu dönüştürülmüş gerekiyor:

<par>Some text</par>
<list>
  <li><par>Some more text</par></li>
  ..
</list>

Asıl sorun şudur: Ben inline etiketleri eklemeniz gerekir, bu yüzden xsl: value-hiçbir seçenek olduğunu ve bunun yerine xsl kullanın: copy-of. Şimdiye kadar ol için şablonlar var | ul ve p ve sonuç şudur:

<par>Some text</par>
<list>
  <li><p>Some more text</p></li>
  ..
</list>

Ben gerçekten sadece daha karmaşık bir XSLT kullanarak istediklerini elde etmek için nasıl herkes bazı ipuçları?

3 Cevap

Buyrun ...

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0">
    <xsl:output method="xml" indent="yes"/>
    <!-- ============================================== -->
    <xsl:template match="/">
        <xsl:apply-templates/>
    </xsl:template>
    <!-- ============================================== -->
    <xsl:template match="p">
        <xsl:element name="par">
            <xsl:apply-templates/>
        </xsl:element>
    </xsl:template>
    <!-- ============================================== -->
    <xsl:template match="ol">
        <xsl:element name="list">
            <xsl:apply-templates/>
        </xsl:element>
    </xsl:template>
    <!-- ============================================== -->
    <xsl:template match="li">
        <xsl:element name="li">
            <xsl:apply-templates/>
        </xsl:element>
    </xsl:template>
    <!-- ============================================== -->
</xsl:stylesheet>

Eğer ile başlarsanız identity transform, başka unsurları içine bir adla elemanları dönüştürmek için genel desen şudur:

<xsl:template match="old_name">
   <new_name>
      <xsl:apply-templates select="node()|@*"/>
   </new_name>
</xsl:template>

Not iki şey:

  1. Eğer dönüştürme ediyorsanız öğesi özniteliklere (veya aktif özelliklerini kapalı şerit niyetinde) kesin olarak biliyorum sürece Genellikle, size select niteliği gösterilen kullanmalısınız; sadece kullanmak değil <xsl:apply-templates/>. Özellikler çocuk düğümler değildir, ve böylece select niteliği olmayan şablonları uygulayarak onlara şablonları geçerli değildir.

  2. Eğer gerçekten yazarak tadını sürece, kullanmak için bir neden hemen hemen hiç yoktur <xsl:element>. Programlı çıkış elemanın adını üretirken istisna değildir.

Hangi, tüm fantezi-shmancy almak istedim aslında, bunu yapabilirsiniz:

<xsl:template match="*">
   <xsl:variable name="new_name">
      <xsl:when test="name()='p'>par</xsl:when>
      <xsl:when test="name()='ol'>list</xsl:when>
      <xsl:when test="name()='li'>item</xsl:when>
      <xsl:otherwise><xsl:value-of select="name()"/></xsl:otherwise>
   </xsl:variable>
   <xsl:element name="{$new_name}">
      <xsl:apply-templates select="@*|node()"/>
   </xsl:element>
</xsl:template>