MarkLogic转换在转换时遇到了问题

时间:2015-01-29 04:28:27

标签: xslt marklogic

我在marklogic中使用XSLT将XML转换为HTML。

这是我的xslt:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="html" encoding="ISO-8859-1" indent="no"/>
    <xsl:template match="/">
        <html>
        <head>
            <title>title</title>
        </head>
        <body>
        <xsl:apply-templates />     
        </body>
    </xsl:template>

    <xsl:template match="ph">
        <xsl:text disable-output-escaping="yes">&lt;/p&gt;</xsl:text>
        <!-- converting inline ph to display para-->
        <p><xsl:apply-templates /></p>
        <xsl:text disable-output-escaping="yes">&lt;p class="para-continued"&gt;</xsl:text>
    </xsl:template>
</xsl:stylesheet>

我的样本xml:

<doc>
<p>some text bla blasome text bla blasome text bla blasome text bla bla</p>
<p>some text bla blasome text <ph>ph content</ph> bla blasome text bla blasome text bla bla</p>
</doc>

Tags are showing in the image

在MarkLogic中使用<xsl:text>时,标签以HTML格式显示,Oxygen没有任何问题,请参阅附图。

2 个答案:

答案 0 :(得分:1)

签入ErrorLog.txt,你会看到类似的内容:

XSLT-DISOUTPUTESC (err:XTRE1620) Disable output escaping not supported: /*:stylesheet/*:template[2]/*:text[1]

换句话说,MarkLogic的当前版本没有实现该功能。它是可选的:http://www.w3.org/TR/xslt20/#d-o-e-in-data-model

你可以尝试这样的事情。请注意,我已经将花括号加倍以在XQuery中转义它们。这也许是使用xsl:for-each-group的好地方。

xdmp:xslt-eval(
  <xsl:stylesheet version="2.0"
     xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="html" encoding="ISO-8859-1" indent="no"/>
    <xsl:template match="/">
        <html>
        <head>
            <title>title</title>
        </head>
        <body>
        <xsl:apply-templates />
        </body>
        </html>
    </xsl:template>


    <xsl:template match="*[ph]">
      <xsl:variable name="qname" select="node-name(.)"/>
      <xsl:element name="{{ $qname }}">
        <xsl:apply-templates select="ph[1]/preceding-sibling::node()"/>
      </xsl:element>
      <xsl:element name="{{ $qname }}">
        <xsl:apply-templates select="ph[1]/node()"/>
      </xsl:element>
      <xsl:element name="{{ $qname }}">
        <xsl:attribute name="class">para-continued</xsl:attribute>
        <xsl:apply-templates select="ph[1]/following-sibling::node()"/>
      </xsl:element>
    </xsl:template>

    <xsl:template match="*">
      <xsl:element name="{{ node-name(.) }}">
        <xsl:apply-templates select="node()"/>
      </xsl:element>
    </xsl:template>
  </xsl:stylesheet>,
  <doc>
    <p>some text bla blasome text bla blasome text bla blasome text bla bla</p>
    <p>some text bla blasome text
      <ph>ph content</ph>
      bla blasome text bla blasome text bla bla
    </p>
  </doc>)

使用7.0-4.3:

<doc>
  <p>some text bla blasome text bla blasome text bla blasome text bla bla</p>
  <p>some text bla blasome text</p>
  <p>ph content</p>
  <p class="para-continued">
      bla blasome text bla blasome text bla bla
  </p>
</doc>

答案 1 :(得分:1)

我建议使用xsl:for-each-group,这样可以提供更灵活,更强大的解决方案:

let $xml := document {
  <doc>
    <p>1some text bla blasome text bla blasome text bla blasome text bla bla</p>
    <p>2some text bla blasome text <ph>ph content</ph> 3bla blasome text bla blasome text bla bla</p>
  </doc>
}

let $xsl :=
  <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

    <xsl:output method="html" encoding="ISO-8859-1" indent="no"/>

    <xsl:template match="/doc">
      <html>
        <head>
          <title>title</title>
        </head>
        <body>
          <xsl:apply-templates />
        </body>
      </html>
    </xsl:template>

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

    <xsl:template match="*[ph]">
      <xsl:variable name="parent" select="."/>

      <xsl:for-each-group select="node()" group-starting-with="node()[self::ph | preceding-sibling::node()[1][self::ph]]">
        <xsl:element name="{{node-name($parent)}}">
          <xsl:copy-of select="$parent/@*"/>
          <xsl:apply-templates select="current-group()"/>
        </xsl:element>
      </xsl:for-each-group>
    </xsl:template>
  </xsl:stylesheet>

return xdmp:xslt-eval($xsl, $xml)

HTH!