具有超链接属性的XML到XML转换

时间:2012-01-16 18:37:13

标签: xml xslt transformation

我有一个类似于:

的XML输入
<data>
 <document docid="docfilename" />
 <record>ABC</record>
 <info>Testing</info>
 <case docid="casefilename">
  <details>
   Some random information
  </details>
  <author>Creator</author>
 </case>
 <page docid="pageurl">M Page</page>
</data>

问题是,我想将这个XML转换为在浏览器中打开的完全相同的XML,人们可以查看转换的XML,只需用docidname / casefilename / pageurl的超链接替换docid属性值取决于链接。

例如

<data>
 <document docid="<a href="docfilename.html">docfilename</a>" />
 <record>ABC</record>
 <info>Testing</info>
 <case docid="<a href="casefilename.html">casefilename</a>">
  <details>
   Some random information
  </details>
  <author>Creator</author>
 </case>
 <page docid="<a href="http://www.example.com">pageurl</a>">M Page</page>
</data>

在上面的输出中,您可以在docid中查看标记,但是用户只会在docid中看到链接,无论在哪里找到该链接,都会在浏览器中显示该文件的链接。

任何以给定格式转换此xml的帮助都将受到高度赞赏。

1 个答案:

答案 0 :(得分:1)

那么您基本上要问的是如何创建在浏览器中打开XML文档时显示的超链接?

没有办法直接这样做。浏览器应该只显示文档中的数据,它不会创建类似的超链接。

您唯一可行的解​​决方案是将其转换为实际的HTML文档,将每个元素/属性转换为文本,并覆盖您想要超链接的属性。这是一个简单的表格:

<?xml version="1.0"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output method="html" indent="yes"/>

  <xsl:template match="/">
    <html>
      <head>
        <title>XML source</title>
      </head>
      <body>
        <pre><xsl:apply-templates /></pre>
      </body>
    </html>
  </xsl:template>

  <xsl:template match="node()">
    <xsl:value-of select="concat('&lt;',name())" />
    <xsl:apply-templates select="@*" />
    <xsl:text>&gt;</xsl:text>
    <xsl:apply-templates select="node()" />
    <xsl:value-of select="concat('&lt;/',name(),'&gt;')" />
  </xsl:template>

  <xsl:template match="text()">
    <xsl:value-of select="." />
  </xsl:template>

  <xsl:template match="@*">
    <xsl:value-of select="concat(' ',name(),'=&quot;',.,'&quot;')" />
  </xsl:template>

  <xsl:template match="@docid">
    <xsl:variable name="url" select="concat(.,'.html')" />
    <xsl:value-of select="concat(' ',name(),'=&quot;')" />
    <a href='{$url}'><xsl:value-of select="." /></a>
    <xsl:text>&quot;</xsl:text>
  </xsl:template>
</xsl:stylesheet>

没有任何漂亮的XML格式化或折叠/扩展节点这样做,但您至少可以根据需要显示带有超链接的XML。正如@lwburk所说,你还没有真正指出这些链接应该来自哪里;你应该能够根据自己的需要调整它。