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"></p></xsl:text>
<!-- converting inline ph to display para-->
<p><xsl:apply-templates /></p>
<xsl:text disable-output-escaping="yes"><p class="para-continued"></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!
我在 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"></p></xsl:text>
<!-- converting inline ph to display para-->
<p><xsl:apply-templates /></p>
<xsl:text disable-output-escaping="yes"><p class="para-continued"></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!