Как извлечь раздел div из одного документа xhtml в другой документ xhtml - PullRequest
2 голосов
/ 24 февраля 2011

Я пытаюсь извлечь раздел div из документа xhtml в другой документ xhtml с помощью xslt. Однако мне это не удалось. Скорее преобразование xslt привело к проводному выводу. Предположим, что следующий xhtml документ для преобразования:

<?xml version="1.0" encoding="iso-8859-1"?>
<html xmlns="http://www.w3.org/1999/xhtml" lang="de">
<head>
   <title>title test</title>
</head>
<body>
   some blabla
   <div>
      <div id="testid" class="testclass">
         hello world!
      </div>
   </div>
   some other blabla <p/>
   test paragraph<p/>
</body>
</html>

xslt должен извлечь раздел div с идентификатором "testid" и записать его в новый документ xhtml, который должен выглядеть следующим образом:

<?xml version="1.0" encoding="iso-8859-1"?>
<html xmlns="http://www.w3.org/1999/xhtml" lang="de">
<head>
   <title>title test</title>
</head>
<body>
   <div id="testid" class="testclass">
      hello world!
   </div>
</body>
</html>

Мой код xslt выглядит следующим образом:

<?xml version="1.0"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output method="xml" version="1.0" indent="yes" omit-xml-declaration="yes"/>
  <xsl:template match="/">
    <html xmlns="http://www.w3.org/1999/xhtml" lang="de">
      <head>
      </head>
      <body>
        <xsl:apply-templates select="node()|text()"/>
      </body>
    </html>
  </xsl:template>

  <xsl:template match="*">
    <xsl:if test="div[@id='testid']">
      <xsl:copy-of select="*"/>
    </xsl:if>
    <xsl:apply-templates select="node()|@*" />
  </xsl:template>

</xsl:stylesheet>

На самом деле вывод выглядит следующим образом:

<html xmlns="http://www.w3.org/1999/xhtml" lang="de">
  <head/>
  <body>de

    title test

    some blabla


    testidtestclass
    hello world!


    some other blabla
    test paragraph

  </body>
</html>

Что мне нужно изменить в xslt, чтобы получить правильные результаты? Любая помощь приветствуется. Спасибо.

Ответы [ 2 ]

2 голосов
/ 24 февраля 2011

Эта таблица стилей (стиль вывода):

<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
 xmlns:xhtml="http://www.w3.org/1999/xhtml"
 xmlns="http://www.w3.org/1999/xhtml"
 exclude-result-prefixes="xhtml">
    <xsl:template match="text()"/>
    <xsl:template match="xhtml:div[@id='testid']">
        <html lang="de">
            <head></head>
            <body>
                <xsl:call-template name="identity"/>
            </body>
        </html>
    </xsl:template>
    <xsl:template match="node()|@*" mode="identity" name="identity">
        <xsl:copy>
            <xsl:apply-templates select="node()|@*" mode="identity"/>
        </xsl:copy>
    </xsl:template>
</xsl:stylesheet>

С этим входом:

<?xml version="1.0" encoding="iso-8859-1"?>
<html xmlns="http://www.w3.org/1999/xhtml" lang="de">
    <head>
        <title>title test</title>
    </head>
    <body>some blabla
        <div>
            <div id="testid" class="testclass">hello world!</div>
        </div>some other blabla 
        <p>test paragraph</p>
    </body>
</html>

Вывод:

<html lang="de" xmlns="http://www.w3.org/1999/xhtml">
    <head></head>
    <body>
        <div id="testid" class="testclass">hello world!</div>
    </body>
</html>

Примечание : Правило идентификации Invoque от соответствующего узла.

Эта таблица стилей (стиль push):

<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
 xmlns:xhtml="http://www.w3.org/1999/xhtml"
 xmlns="http://www.w3.org/1999/xhtml"
 exclude-result-prefixes="xhtml">
    <xsl:template match="/">
        <html lang="de">
            <head></head>
            <body>
                <xsl:apply-templates select="//xhtml:div[@id='testid']"/>
            </body>
        </html>
    </xsl:template>
    <xsl:template match="node()|@*">
        <xsl:copy>
            <xsl:apply-templates select="node()|@*"/>
        </xsl:copy>
    </xsl:template>
</xsl:stylesheet>

И шаблон "кирпич":

<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
 xmlns:xhtml="http://www.w3.org/1999/xhtml"
 xmlns="http://www.w3.org/1999/xhtml"
 exclude-result-prefixes="xhtml">
    <xsl:template match="/">
        <html lang="de">
            <head></head>
            <body>
                <xsl:copy-of select="//xhtml:div[@id='testid']"/>
            </body>
        </html>
    </xsl:template>
</xsl:stylesheet>
0 голосов
/ 24 февраля 2011

Это преобразование :

<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
 xmlns:x="http://www.w3.org/1999/xhtml"
 exclude-result-prefixes="x">
 <xsl:output indent="yes" encoding="iso-8859-1"/>


 <xsl:template match="/">
  <html xmlns="http://www.w3.org/1999/xhtml" lang="de">
   <head/>
   <body>
    <xsl:apply-templates/>
   </body>
  </html>
 </xsl:template>

 <xsl:template match="x:div[@id='testid']">
  <xsl:copy-of select="."/>
 </xsl:template>

 <xsl:template match="text()"/>
</xsl:stylesheet>

при применении к предоставленному документу XML:

<html xmlns="http://www.w3.org/1999/xhtml" lang="de">
<head>
  <title>title test</title>
</head>
<body>
  some blabla
  <div>
    <div id="testid" class="testclass">
      hello world!
   </div>
  </div>
  some other blabla <p/>
  test paragraph<p/>
</body>
</html>

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

<?xml version="1.0" encoding="iso-8859-1"?>
<html lang="de" xmlns="http://www.w3.org/1999/xhtml">
  <head />
  <body>
    <div id="testid" class="testclass">
      hello world!
   </div>
  </body>
</html>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...