【问题标题】:Parse the XML Elements inside the CData Using XSLT and Print to HTML使用 XSLT 解析 CData 中的 XML 元素并打印到 HTML
【发布时间】:2013-12-13 11:42:41
【问题描述】:

输入xmlis

<getArtifactContentResponse>
<return>
<![CDATA[
<metadata>
<overview>       
<name>scannapp</name>
<developerId>developer702</developerId>
<stateId>2</stateId>
<serverURL>abc.com</serverURL>
<id>cspapp1103</id>
<description>scann doc</description>
<hostingTypeId>1</hostingTypeId>       
</overview>
</metadata>
  ]]>
  </return>
</getArtifactContentResponse>

下面是我开发的样式表。我能够在 Cdata 中检索 XML,但无法获取元素值。

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0" >
<xsl:output method="html" encoding="utf-8" omit-xml-declaration="no" indent="no"/>
   <xsl:template match="/">
      <html>
         <body>
            <h1>Company Details</h1>
            <table border="1">
               <tr>
                  <th>name</th>
                  <th>developerId</th>
                  <th>Id</th>
               </tr>table

               <xsl:variable name ="data" select="//getArtifactContentResponse/return/node()" />
                  <tr>
                     <td>
                        <xsl:value-of select="$data/metadata/overview/name" disable-output-escaping="yes"/>


                     </td>
                     <td>
                        <xsl:value-of select="$data/metadata/overview/developerId" />
                     </td>
                     <td>
                        <xsl:value-of select="$data/metadata/overview/Id" />
                     </td>
                  </tr>

            </table>

         </body>
      </html>
   </xsl:template>
</xsl:stylesheet>

输出为

<html><body><h1>Company Details</h1><table border="1"><tr><th>name</th><th>developerId</th><th>serverURL</th></tr>table


                  <tr><td></td><td></td><td></td></tr></table></body></html>

预期输出

<html><body><h1>Company Details</h1><table border="1"><tr><th>name</th><th>developerId</th><th>serverURL</th></tr>table


                  <tr><td>scannapp</td><td>developer702</td><td>cspapp1103</td></tr></table></body></html>

我想获取值名称、developerId、Id 并打印到 HtML。如何做到这一点请帮助我。使用 XSLT 1.0 版。

【问题讨论】:

  • 您使用哪种 XSLT 1.0 处理器?您需要一个可以将带有 XML 的字符串解析为节点的扩展函数。
  • @MartinHonnen 你想到了哪个函数?
  • @user3016153,取决于 XSLT 处理器,有现有的解决方案,或者很容易实现一个,例如使用 Microsoft 的 XslCompiledTransform,您可以使用扩展函数或他们使用 @ 的对象987654328@ 解析 XML。使用 Microsoft 的 MSXML,您可以使用在 JScript 中实现的扩展功能,只需创建例如function parseXml(string) { var doc = new ActiveXObject('Msxml2.DOMDocument.3.0'); doc.loadXML(string); return doc; }.
  • 我试过但得到 java.lang.NoSuchMethodException: For extension function, could not find method org.apache.xml.utils.NodeVector.parse([ExpressionContext,]
  • 在我的评论中,我就如何为 Microsoft 的 XslCompiledTransform XSLT 处理器和 Microsoft 的 MSXML XSLT 处理器实现扩展功能提出了建议。由于所有这些都取决于处理器,因此它不适用于其他处理器。我在第一条评论中请您告诉我们您使用的是哪种 XSLT 处理器。如果您使用 Java,那么我建议使用具有扩展功能的 Saxon 版本将 XML 解析为节点,例如 saxonica.com/documentation/index.html#!functions/saxon/parse

标签: xslt


【解决方案1】:

AFAIK,没有办法将 CDATA 解析为 XML

使用扩展函数将部分解析为文本会很好,但并不是真正必要的。这是一个提取您所追求的三个项目的示例:

...
<xsl:variable name ="cdata" select="/getArtifactContentResponse/return" />

<name>
    <xsl:value-of select="substring-before(substring-after($cdata, '&lt;name&gt;'), '&lt;/name&gt;')"/>
</name>

<developerId>
    <xsl:value-of select="substring-before(substring-after($cdata, '&lt;developerId&gt;'), '&lt;/developerId&gt;')"/>
</developerId>

<id>
    <xsl:value-of select="substring-before(substring-after($cdata, '&lt;id&gt;'), '&lt;/id&gt;')"/>
</id>
...

【讨论】:

  • 代码工作正常。我得到了预期的结果。非常感谢..有没有其他方法,因为我不想使用子字符串函数。
  • 我相信 substring 函数提供了您预期输出的最短路径。你为什么不想使用它?
猜你喜欢
  • 2012-05-06
  • 2011-07-06
  • 1970-01-01
  • 1970-01-01
  • 2021-04-18
  • 2013-01-08
  • 1970-01-01
  • 2016-06-05
  • 1970-01-01
相关资源
最近更新 更多