XSLT для преобразования документа XHTML - PullRequest
2 голосов
/ 01 августа 2010

Я новичок в XSLT, но он был предложен мне как способ решения конкретной задачи. У меня есть куча файлов xhtml, из которых я хотел бы удалить боковую панель. Боковая панель содержится в элементе

.

Я могу успешно выполнить преобразование идентичности, используя инструкции в этом ответе: Как удалить элементы из xml, используя xslt с таблицей стилей и xsltproc? , но я не могу сопоставить элементы, которые мне нужны Удалить. Возможно, это потому, что они не являются элементами верхнего уровня, как в каждом примере этого шаблона проектирования, который я нахожу?

Может ли кто-нибудь объяснить правильный способ удаления

и всех его дочерних элементов из преобразования идентификации?

1 Ответ

5 голосов
/ 01 августа 2010

Вполне вероятно, что ваша проблема возникает из-за присутствия пространства имен по умолчанию (xhtml) в исходном XHTML-файле (который вы нам не показали, так что в лучшем случае это предположение).

Может ли кто-нибудь объяснить правильный способ удаления и всех его дочерних элементов из преобразования идентификации?

Вот как это сделать в случае наличия пространства имен по умолчанию :

<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
 xmlns:xhtml="http://www.w3.org/1999/xhtml">
 <xsl:output omit-xml-declaration="yes" indent="yes"/>
 <xsl:strip-space elements="*"/>

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

 <xsl:template match="xhtml:div[@class='foo']"/>
</xsl:stylesheet>

Когда это преобразование применено к следующему документу XHTML :

<html xmlns="http://www.w3.org/1999/xhtml">
    <div class="class1">
        <p>Text1</p>
    </div>
    <div class="foo">
        <p>Text foo</p>
    </div>
    <div class="class2">
        <p>Text2</p>
    </div>
</html>

, будет получен нужный, правильный результат :

<html xmlns="http://www.w3.org/1999/xhtml">
   <div class="class1">
      <p>Text1</p>
   </div>
   <div class="class2">
      <p>Text2</p>
   </div>
</html>

Использование префикса пространства имен в выражении совпадения шаблона необходимо , поскольку XPath считает любое имя без префикса в "пространстве имен", а выражение совпадения с именами без префикса - нет.сопоставлять любые узлы, поскольку он указывает узлы в «no namspace», но все узлы исходного документа находятся в пространстве имен XHTML.

В случае, если в исходном документе нет пространства имен по умолчанию.Это преобразование может быть упрощено :

Когда это преобразование применяется к следующему документу XML (обратите внимание, что оно не определяет пространство имен по умолчанию):

<html>
    <div class="class1">
        <p>Text1</p>
    </div>
    <div class="foo">
        <p>Text foo</p>
    </div>
    <div class="class2">
        <p>Text2</p>
    </div>
</html>

желаемый, правильный результат получается :

<html>
   <div class="class1">
      <p>Text1</p>
   </div>
   <div class="class2">
      <p>Text2</p>
   </div>
</html>

ОбаДля преобразования используйте правило идентификации , чтобы скопировать любой узел документа и другой шаблон, который переопределяет правило идентификации для узлов, соответствующих "div[@class='foo']".Этот второй шаблон пуст (не имеет тела), что означает, что соответствующий узел и корневое поддерево в нем не обрабатываются вообще (игнорируются) и, следовательно, не будут отображаться в выходных данных.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...