当前位置: 首页 > 知识库问答 >
问题:

从XML节点和调用模板转换XHTML,将XHTML作为上下文传递

计泉
2023-03-14

如何从XML节点转换XHTML,然后调用模板,就好像XML节点是XHTML的父节点一样。

参考下面的代码,我想从group/Clob/text()中获取转换为XHTML/XML的值,并继续根据模板处理这些新节点。。例如中心模板。

这将允许我实现从数据集转换XML的总体目标,该数据集包含来自富文本编辑器的Clob值,然后创建一个XSL:FO文件,然后用于创建PDF。

下面的细节应该足以说明我已经尝试完成了什么。

<!--XML-->
<root>

  <group>
    <key>16692504</key>
    <Clob>&lt;body&gt;Testing se&lt;font color="#99cc00"&gt;co&lt;/font&gt;nd o&lt;font color="#99cc00" style="background-color: #000000;"&gt;bser&lt;/font&gt;vation&lt;/body&gt;</Clob>
  </group>
  <group>
    <key>16692508</key>
    <Clob>&lt;body&gt;Testing se&lt;font color="#99cc00"&gt;co&lt;/font&gt;nd o&lt;font color="#99cc00" style="background-color: #000000;"&gt;bser&lt;/font&gt;vation&lt;/body&gt;</Clob>
  </group>

</root>

这是我用来将Clob节点中的转义内容转换回原始格式的XSL文件:超文本标记语言/XHTML。

<!--xsl-->
<?xml version="1.0"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:fo="http://www.w3.org/1999/XSL/Format" version="1.0">

<xsl:template name="group"> 
    <xsl:for-each select="//group">

        <xsl:apply-templates mode="unescaped" select="Clob"/>

    </xsl:for-each>
</xsl:template>

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

  <xsl:template match="*">
    <xsl:copy>
      <xsl:apply-templates/>
    </xsl:copy>
  </xsl:template>

  <xsl:template match="text()">
    <xsl:variable name="escaped-text">
      <xsl:call-template name="replace-string">
        <xsl:with-param name="text" select="."/>
        <xsl:with-param name="replace" select="'&quot;'"/>
        <xsl:with-param name="with" select="'\&quot;'"/>
      </xsl:call-template>
    </xsl:variable>
    <xsl:choose>
        <xsl:when test="parent::*[name() = 'Clob']"> <!-- Converts escaped characters in this node back to XHTML/XML -->
        <xsl:value-of disable-output-escaping="yes" select="normalize-space(.)"/>
      </xsl:when>
      <xsl:otherwise>
        <xsl:value-of disable-output-escaping="no" select="normalize-space(.)"/> <!-- Preserves escaping for non essential fields -->
      </xsl:otherwise>
    </xsl:choose>
  </xsl:template>

  <xsl:template name="replace-string">
    <xsl:param name="text"/>
    <xsl:param name="replace"/>
    <xsl:param name="with"/>
    <xsl:choose>
      <xsl:when test="contains($text,$replace)">
        <xsl:value-of select="substring-before($text,$replace)"/>
        <xsl:value-of select="$with"/>
        <xsl:call-template name="replace-string">
          <xsl:with-param name="text" select="substring-after($text,$replace)"/>
          <xsl:with-param name="replace" select="$replace"/>
          <xsl:with-param name="with" select="$with"/>
        </xsl:call-template>
      </xsl:when>
      <xsl:otherwise>
        <xsl:choose>
         <xsl:when test="parent::*[name() = 'Clob']">
            <xsl:value-of disable-output-escaping="yes" select="$text"/>
          </xsl:when>
          <xsl:otherwise>
            <xsl:value-of disable-output-escaping="no" select="$text"/>
          </xsl:otherwise>
        </xsl:choose>
     </xsl:otherwise>
    </xsl:choose>
  </xsl:template>

   <xsl:template match="body">
    <fo:block text-align="body">
      <xsl:apply-templates select="*|text()"/>
    </fo:block>
  </xsl:template>  

</xsl:stylesheet>

当我将XML返回到下面的输出中时,我希望调用模板(包括其属性),并最终从这些模板返回上下文。

<!-- Desired XML Output for further processing -->
<root>

  <group>
    <key>16692504</key>
    <Clob><![CDATA[<body><h1>Testing<br /><br /><font color="#00ff00">testing</font><br /><br /><font color="#ffff00">testing</font></h1></body>]]></Clob>
  </group>
  <group>
    <key>16692508</key>
    <Clob><body>Testing se<font color="#99cc00">co</font>nd o<font color="#99cc00" style="background-color: #000000;">bser</font>vation</body>]]></Clob>
  </group>

</root>

最后,这将帮助我生成XSL:FO模板,然后用于创建PDF文件。这将使我能够提供专门为XSL:FO格式化的HTML富文本字段,以便将HTML转换为等效的HTML。

我正在使用由Doug Tidwell在IBM创建的XSL: FO样式表和指南,这增加了从我的主XSL:样式表中将其称为模板的障碍。以下是该样式表的详细信息。

https://www.ibm.com/developerworks/library/x-xslfo2app/index.html#artdownload

共有1个答案

仲孙诚
2023-03-14

XslCompiledTransform允许您在C#或VB. NET中使用带有msxsl: script元素或随https://docs.microsoft.com/en-us/dotnet/api/system.xml.xsl.xsltargumentlist.addextensionobject?view=netframework-4.7.2#System_Xml_Xsl_XsltArgumentList_AddExtensionObject_System_String_System_Object_传递的扩展对象的扩展“脚本”,因此理论上您可以轻松地在C#中编写一个函数,该函数接受string参数,将其馈送到字符串参数(https://docs.microsoft.com/en-us/dotnet/api/system.xml.xpath.xpathdocument.-ctor?view=netframework-4.7.2#System_Xml_XPath_XPathDocument__ctor_System_IO_TextReader_)的StringReader上的XPathDocument,并从C#函数(即XPathNavigator)返回XPathDocument上的CreateNavigator()。然后XSLT可以调用该函数并使用正常的XPath导航或模板处理,就像任何其他输入文档一样。

设置是否允许在XslCompiledTransform上启用“脚本”处理(https://docs.microsoft.com/en-us/dotnet/api/system.xml.xsl.xsltsettings.enablescript?view=netframework-4.7.2#System\u Xml\u Xsl\u XsltSettings\u EnableScript)或允许您在传递给XslCompiledTransform方法的XSLTargetList上设置扩展对象,但C代码相当简单

public XPathNavigator ParseXml(string xmlCode)
{
  using (StringReader sr = new StringReader(xmlCode))
  {
    return new XPathDocument(sr).CreateNavigator();
  }
}

XPathNavigator甚至允许您在需要时解析片段,如果您在StringReader上使用适当的XmlReader,因此按照XPath 3.1的行实现一些东西parse-xml片段也是可能的。

 类似资料:
  • 问题内容: 期望: 结果: Jsoup可以将值HTML转换为XHTML吗? 问题答案: 见:

  • 本文向大家介绍HTML和XHTML文档类型,包括了HTML和XHTML文档类型的使用技巧和注意事项,需要的朋友参考一下 为了验证HTML或XHTML的任何页面,您将需要一个doctype。这是一串文本,位于文档顶部,可告诉浏览器确切的标记标准已用于创建页面。 XHTML严格 当您不使用任何框架集或折旧标签时,此doctype将在XHTML文档中使用。 <!DOCTYPE html PUBLIC "

  • 基于 node.js 开发的 xhtml 字符串解析引擎。 本项目是一个处理 HTML 模板的引擎,你可以用类似 jQuery 的方式去操作一段字符串模板,比如 Vue-loader 根据 template 生成 render 函数基于此开发将会非常容易。 首先你需要通过命令行安装,就像这样: npm install --save xhtml-engine 安装好了以后,传入需要的字符串获取引擎对

  • “n”表示标记名称的名称,“v”表示标记的值 我应该在XSLT中指定什么?

  • 我有一个Apache camel应用程序,它在rest服务和web服务之间进行中介。Rest服务是调用方,web服务是后端。我已经取得了进展,直到我从web服务获得响应,并将其转换为XML。现在,我必须以特定的格式(例如,使用一些附加的事务和会话ID)向调用方发送JSON响应,从XML中提取数据。对此我有什么选择?是否有可用的工具可以使用XSD创建脚本化的JSON模板,或者我必须手动编写脚本?如果

  • 我有一个用例,其中输入数据是xml格式的。它包含多个字段,而我们只感兴趣阅读很少的字段。 根据不同的用例,必须编写单独的velocity模板来将xml转换为json数据。 关于如何编写velocity模板以将XML转换为JSON,我找不到更好的指南。有人能帮助我们如何编写从XML到JSON转换的velocity吗? 提前感谢!