отображать самозакрывающиеся элементы xml для вывода html - PullRequest
0 голосов
/ 28 декабря 2011

Мое требование - отображать некоторые элементы xml (которые являются частью ввода xml) на странице html.

например:

<org:specs>
  <org:wild animal="6" species="land"/>
  <org:fish animal="7" species="water"/>
  <org:bird animal="8" species="trees"/>
  <org:mammal animal="9" species="land"/>
</org:specs>

Я хочу, чтобы весь этот xml фрагмент отображался в том виде, в каком он есть на странице вывода html, сохраняя отступ, который следует во входных данных. Кто-нибудь имеет представление о том, как реализовать это с помощью XSLT или Xquery?

РЕДАКТИРОВАТЬ: 2 января 2012

Я попробовал первое решение (приведенное ниже). Это работает, но я потерял отступ. Давая более подробную информацию, реализация в моем случае будет использовать Xquery. Я буду использовать команду Marklogic xdmp:xslt-eval(<Stylesheet>,<A-Xquery-function-retrieving-the-above-xml>). Когда я использую первое решение, полученная HTML-страница не имеет отступа

Ответы [ 3 ]

4 голосов
/ 28 декабря 2011

I.Простой способ :

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

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

 <xsl:template match="org:specs">
     <xmp>
       <xsl:copy-of select="."/>
     </xmp>
 </xsl:template>
</xsl:stylesheet>

при применении к этому XML-документу (предоставленный некорректно сформированный текст сделал хорошосформированный XML-документ):

<t xmlns:org="some:org">
<org:specs>
  <org:wild animal="6" species="land"/>
  <org:fish animal="7" species="water"/>
  <org:bird animal="8" species="trees"/>
  <org:mammal animal="9" species="land"/>
</org:specs>
</t>

производит :

<xmp>
   <org:specs xmlns:org="some:org">
      <org:wild animal="6" species="land"/>
      <org:fish animal="7" species="water"/>
      <org:bird animal="8" species="trees"/>
      <org:mammal animal="9" species="land"/>
   </org:specs>
</xmp>

, и это отображается в браузере требуемым образом :

<org:specs xmlns:org="some:org">
  <org:wild animal="6" species="land"/>
  <org:fish animal="7" species="water"/>
  <org:bird animal="8" species="trees"/>
  <org:mammal animal="9" species="land"/>
</org:specs>

II.Prety-выглядящий, отображаемый браузером XML

См. Код XSLT XPath Visualizer , как это приложение дает такой результат.

III.Генерация всех необходимых входных данных для браузера в виде текста (method="text"):

<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output method="text" encoding="utf-8"/>

 <xsl:template match="/*">
  <xsl:apply-templates select="*[1]" mode="textify"/>
 </xsl:template>

 <xsl:template match="*/*[*]" mode="textify">
         <xsl:text>&amp;lt;</xsl:text>
          <xsl:value-of select="name()"/>

   <xsl:apply-templates select="@*" mode="textify"/>
   <xsl:text>></xsl:text>
   <xsl:apply-templates select="*|text()" mode="textify"/>

         <xsl:text>&amp;lt;/</xsl:text>
          <xsl:value-of select="name()"/>
   <xsl:text>></xsl:text>
 </xsl:template>

 <xsl:template match="*/*[not(node())]" mode="textify">
         <xsl:text>&amp;lt;</xsl:text>
          <xsl:value-of select="name()"/>

   <xsl:apply-templates select="@*" mode="textify"/>
   <xsl:text>/></xsl:text>
 </xsl:template>

 <xsl:template match="@*" mode="textify">
  <xsl:text> </xsl:text>
  <xsl:value-of select="name()"/>
  <xsl:text>="</xsl:text>
  <xsl:value-of select="."/>
  <xsl:text>"</xsl:text>
 </xsl:template>

 <xsl:template match="text()" mode="textify">
  <xsl:call-template name="textify">
   <xsl:with-param name="pText" select="."/>
  </xsl:call-template>
 </xsl:template>

 <xsl:template name="textify">
  <xsl:param name="pText"/>

  <xsl:if test="string-length($pText) >0">
   <xsl:variable name="vChar" select="substring($pText,1,1)"/>
    <xsl:choose>
     <xsl:when test="$vChar = ' '">
       <xsl:value-of select="'&amp;#xA0;'"/>
     </xsl:when>
     <xsl:when test="$vChar = '&#9;'">
       <xsl:value-of select="'&amp;#xA0;&amp;#xA0;'"/>
     </xsl:when>
     <xsl:when test="$vChar = '&#xA;'">
       <xsl:value-of select="'&lt;br />'"/>
     </xsl:when>
     <xsl:otherwise>
      <xsl:value-of select="$vChar"/>
     </xsl:otherwise>
    </xsl:choose>
  <xsl:call-template name="textify">
   <xsl:with-param name="pText" select=
    "substring($pText, 2)"/>
  </xsl:call-template>
  </xsl:if>
 </xsl:template>

</xsl:stylesheet>

, когда это преобразование применяется к тому же XML-документу (см. Выше), оно дает желаемый результат:

&lt;org:specs><br />&#xA0;&#xA0;&lt;org:wild animal="6" species="land"/><br />&#xA0;&#xA0;&lt;org:fish animal="7" species="water"/><br />&#xA0;&#xA0;&lt;org:bird animal="8" species="trees"/><br />&#xA0;&#xA0;&lt;org:mammal animal="9" species="land"/><br />&lt;/org:specs>

и отображается браузером как :

2 голосов
/ 03 января 2012

В зависимости от браузера, HTML не очень хорошо сохраняет пробелы, если вы не начнете делать CSS, который не поддерживается в браузерах единообразно. Я делаю следующее, что сохраняет пробелы на дисплее и в сериализации символов:

<code>xquery version "1.0-ml";

declare namespace org = "someorg";

let $xml := 
<org:specs>
  <org:wild animal="6" species="land"/>
  <org:fish animal="7" species="water"/>
  <org:bird animal="8" species="trees"/>
  <org:mammal animal="9" species="land"/>
</org:specs>


let $quote-options :=
<options xmlns="xdmp:quote">
  <method>xml</method>
  <indent>yes</indent>
  <indent-untyped>yes</indent-untyped>
</options>

return

<div><pre>
{xdmp:quote($xml, $quote-options)}
0 голосов
/ 02 января 2012

Следующее работает как талисман в MarkLogic CQ, используя (старый) FireFox:

let $xml :=
<org:specs xmlns:org="some:org"> 
  <org:wild animal="6" species="land"/> 
  <org:fish animal="7" species="water"/> 
  <org:bird animal="8" species="trees"/> 
  <org:mammal animal="9" species="land"/> 
</org:specs> 

return

<html><body>
<h1>Org</h1>

<xmp>{$xml}</xmp>

</body>
</html>

Хотя не уверен, что тег xmp поддерживается всеми браузерами.Я использовал подход «textify» (поместив его в pre без тегов br), как это предложил Dimitre.

...