MarkLogic 转换在转换时遇到问题

MarkLogic transformation got issue while transform

我在 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>

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

签入 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>

我建议使用 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!