如何为 html 字符串进行 xsl 模板匹配
How to do a xsl-template match for a html string
我有一个场景需要使用 XSLT 在 pdf 中呈现 html。我在 xml 文件中有一些 html 内容,例如
<section>
<p><b><u>Heelo</u></b></p>
</section>
我需要在 pdf 中呈现它。
<xsl:template match="b">
<fo:inline font-weight="bold">
<xsl:apply-templates select="*|text()" />
</fo:inline>
</xsl:template>
<xsl:template match="u">
<fo:inline text-decoration="underline">
<xsl:apply-templates select="*|text()" />
</fo:inline>
</xsl:template>
<xsl:template match="i">
<fo:inline font-style="italic">
<xsl:apply-templates select="*|text()" />
</fo:inline>
</xsl:template>
但是这个模板匹配不起作用。在 java?
中创建 xml 时,如何实现这一点,或者有什么方法可以将 < 替换为 < 和 > 为 >
提前感谢您的帮助!!!
如果你想解析 HTML 你需要一种方法来集成一个 HTML 解析器,如果你在 XSLT 2 处理器中使用 David Carlisle 的 HTML 解析器实现来自 https://github.com/davidcarlisle/web-xslt/blob/master/htmlparse/htmlparse.xsl 的 XSLT 2,然后您可以导入它并调用函数将 section
元素的内容解析为要由您的模板处理的节点:
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:fo="http://www.w3.org/1999/XSL/Format"
xmlns:d="data:,dpc"
exclude-result-prefixes="#all"
version="3.0">
<xsl:import href="https://raw.githubusercontent.com/davidcarlisle/web-xslt/master/htmlparse/htmlparse.xsl"/>
<xsl:output indent="yes"/>
<xsl:template match="/">
<fo:root>
<fo:layout-master-set>
<fo:simple-page-master master-name="first" page-height="29.7cm" page-width="21cm" margin-top="1cm" margin-bottom="2cm" margin-left="2.5cm" margin-right="2.5cm">
<fo:region-body margin-top="1cm"/>
<fo:region-before extent="1cm"/>
<fo:region-after extent="1.5cm"/>
</fo:simple-page-master>
</fo:layout-master-set>
<fo:page-sequence master-reference="first">
<fo:flow flow-name="xsl-region-body">
<fo:block>
<xsl:apply-templates/>
</fo:block>
</fo:flow>
</fo:page-sequence>
</fo:root>
</xsl:template>
<xsl:template match="section">
<fo:block>
<xsl:apply-templates select="d:htmlparse(., '', true())/node()"/>
</fo:block>
</xsl:template>
<xsl:template match="b">
<fo:inline font-weight="bold">
<xsl:apply-templates select="*|text()" />
</fo:inline>
</xsl:template>
<xsl:template match="u">
<fo:inline text-decoration="underline">
<xsl:apply-templates select="*|text()" />
</fo:inline>
</xsl:template>
<xsl:template match="i">
<fo:inline font-style="italic">
<xsl:apply-templates select="*|text()" />
</fo:inline>
</xsl:template>
</xsl:stylesheet>
https://xsltfiddle.liberty-development.net/94hvTAp
我已经按照你的问题使用了你的模板,但请注意,你可以正常地将 <xsl:apply-templates select="*|text()" />
的所有用法简化为 <xsl:apply-templates/>
。
其他方式取决于所使用的特定 XSLT 处理器(即它是否提供像 http://saxonica.com/html/documentation/functions/saxon/parse-html.html 这样的扩展,或者它是否允许您实现自己的集成 HTML 解析器的扩展功能)。
如果 HTML 格式正确 XML(例如,具有所有必要的结束标记和引号属性,不使用 HTML 特定实体引用),那么您也可以使用XPath 3.1 函数 parse-xml-fragment
与 XSLT 3 处理器如 Saxon 9.8 或更高版本:
<xsl:template match="section">
<fo:block>
<xsl:apply-templates select="parse-xml-fragment(.)/node()"/>
</fo:block>
</xsl:template>
我有一个场景需要使用 XSLT 在 pdf 中呈现 html。我在 xml 文件中有一些 html 内容,例如
<section>
<p><b><u>Heelo</u></b></p>
</section>
我需要在 pdf 中呈现它。
<xsl:template match="b">
<fo:inline font-weight="bold">
<xsl:apply-templates select="*|text()" />
</fo:inline>
</xsl:template>
<xsl:template match="u">
<fo:inline text-decoration="underline">
<xsl:apply-templates select="*|text()" />
</fo:inline>
</xsl:template>
<xsl:template match="i">
<fo:inline font-style="italic">
<xsl:apply-templates select="*|text()" />
</fo:inline>
</xsl:template>
但是这个模板匹配不起作用。在 java?
中创建 xml 时,如何实现这一点,或者有什么方法可以将 < 替换为 < 和 > 为 >提前感谢您的帮助!!!
如果你想解析 HTML 你需要一种方法来集成一个 HTML 解析器,如果你在 XSLT 2 处理器中使用 David Carlisle 的 HTML 解析器实现来自 https://github.com/davidcarlisle/web-xslt/blob/master/htmlparse/htmlparse.xsl 的 XSLT 2,然后您可以导入它并调用函数将 section
元素的内容解析为要由您的模板处理的节点:
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:fo="http://www.w3.org/1999/XSL/Format"
xmlns:d="data:,dpc"
exclude-result-prefixes="#all"
version="3.0">
<xsl:import href="https://raw.githubusercontent.com/davidcarlisle/web-xslt/master/htmlparse/htmlparse.xsl"/>
<xsl:output indent="yes"/>
<xsl:template match="/">
<fo:root>
<fo:layout-master-set>
<fo:simple-page-master master-name="first" page-height="29.7cm" page-width="21cm" margin-top="1cm" margin-bottom="2cm" margin-left="2.5cm" margin-right="2.5cm">
<fo:region-body margin-top="1cm"/>
<fo:region-before extent="1cm"/>
<fo:region-after extent="1.5cm"/>
</fo:simple-page-master>
</fo:layout-master-set>
<fo:page-sequence master-reference="first">
<fo:flow flow-name="xsl-region-body">
<fo:block>
<xsl:apply-templates/>
</fo:block>
</fo:flow>
</fo:page-sequence>
</fo:root>
</xsl:template>
<xsl:template match="section">
<fo:block>
<xsl:apply-templates select="d:htmlparse(., '', true())/node()"/>
</fo:block>
</xsl:template>
<xsl:template match="b">
<fo:inline font-weight="bold">
<xsl:apply-templates select="*|text()" />
</fo:inline>
</xsl:template>
<xsl:template match="u">
<fo:inline text-decoration="underline">
<xsl:apply-templates select="*|text()" />
</fo:inline>
</xsl:template>
<xsl:template match="i">
<fo:inline font-style="italic">
<xsl:apply-templates select="*|text()" />
</fo:inline>
</xsl:template>
</xsl:stylesheet>
https://xsltfiddle.liberty-development.net/94hvTAp
我已经按照你的问题使用了你的模板,但请注意,你可以正常地将 <xsl:apply-templates select="*|text()" />
的所有用法简化为 <xsl:apply-templates/>
。
其他方式取决于所使用的特定 XSLT 处理器(即它是否提供像 http://saxonica.com/html/documentation/functions/saxon/parse-html.html 这样的扩展,或者它是否允许您实现自己的集成 HTML 解析器的扩展功能)。
如果 HTML 格式正确 XML(例如,具有所有必要的结束标记和引号属性,不使用 HTML 特定实体引用),那么您也可以使用XPath 3.1 函数 parse-xml-fragment
与 XSLT 3 处理器如 Saxon 9.8 或更高版本:
<xsl:template match="section">
<fo:block>
<xsl:apply-templates select="parse-xml-fragment(.)/node()"/>
</fo:block>
</xsl:template>