使用xslt重构XML仅显示文本

时间:2011-11-01 11:47:58

标签: xml xslt

我有一个xml文件作为xsl文件的输入。当我将xsl的outputmethod指定为xml并使用xsl:element定义元素或者匹配xml中的元素时,如其他线程所述,我没有得到任何标签。我只得到xml的文本。我有试过各种例子。无论我尝试什么,我只得到xml的文本部分。你能给我一个简单的例子,其中包含使用xsl将一个xml转换为另一个xml的完整工作代码。

很抱歉没有发布样本。

我尝试用两种方式重构xml:

1)在同一个文件夹中放入xsl和xml文件,然后使用浏览器打开xml。xsl文件将应用于xml,如下所示。

的test.xml:

<?xml version="1.0" encoding="ISO-8859-1"?>
<?xml-stylesheet type="text/xsl" href="sample.xsl"?>
<root>
<info>
    <firstname>Bob</firstname>
    <lastname>Joe</lastname>
</info>
<notes>
    <note>text1</note>
    <note>text2</note>
</notes>
<othernotes>
    <note>text3</note>
    <note>text4</note>
</othernotes>
</root>

sample.xsl

<?xml version="1.0" encoding="ISO-8859-1"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:template match="root">
   <root>
     <xsl:copy-of select="info"/>
     <notes>
        <xsl:copy-of select="othernotes"/>
     </notes>
   </root>
</xsl:template>
</xsl:stylesheet>

输出: Bob Joe text3 text4

两个文件都在同一个文件夹中,我使用浏览器打开xml文件以查看输出。

2)我在项目中使用带有xslt的struts框架。设置为视图的xml如下所示。 的 XML:

<root>
<data>
<array-list>
<array-list xsi:type="java:java.util.ArrayList">
<slot-info-object avail-crit-thresh="-1.0" avail-fif-min="-1.0" avail-five-min="-1.0" avail-one-day="0.0" avail-one-hr="-1.0" avail-warn-thresh="-1.0" freeslot="0" keyn-service-subtype-id="9" perf-crit-thresh="-1.0" perf-fif-min="-1.0" perf-five-min="-1.0" perf-one-day="0.0" perf-one-hr="-1.0" perf-warn-thresh="-1.0" severity-type="0" shared-script-id="-1" slot-id="671457" trans-id="733299" user-id="0" xsi:type="java:com.keynote.mykeynote.service.dashboard.SlotInfoObject">
<slot-alias>Single slot</slot-alias>
</slot-info-object>
<slot-info-object avail-crit-thresh="-1.0" avail-fif-min="1.0" avail-five-min="1.0" avail-one-day="1.0" avail-one-hr="1.0" avail-warn-thresh="-1.0" freeslot="0" keyn-service-subtype-id="9" perf-crit-thresh="-1.0" perf-fif-min="0.5105" perf-five-min="0.529" perf-one-day="0.6195208333333333" perf-one-hr="0.5505" perf-warn-thresh="-1.0" severity-type="0" shared-script-id="595" slot-id="685397" trans-id="-7105" user-id="0">
<slot-alias>SharedSlot</slot-alias>
</slot-info-object>
</array-list>
</array-list>
</data>
</root>

视图是包含以下代码的xsl文件: XSL文件:

<?xml version="1.0" encoding="ISO-8859-1"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

<xsl:output method="xml" indent="yes"/>

<xsl:template match="/root/data/array-list/array-list">
<root>
<slot-info-object>
     <xsl:for-each select="slot-info-object">
     <xsl:copy-of select="slot-alias"/>     
     </xsl:for-each>
</slot-info-object>
</root>
</xsl:template>

</xsl:stylesheet>

输出: Single slotSharedSlot

还有一个问题: request.setAttribute(StrutsCXConstants.XML_KEY,data); 这里的数据是像ArrayList这样的java集合。这行是写在struts Action文件中的。这只是转换为视图的xml。 当我们在xsl

中说这个时
<xsl:output method="xml" indent="yes"/>

Struts Action类中的响应类型是否必须设置为“text / xml”

感谢。

4 个答案:

答案 0 :(得分:4)

这可能是因为您的模板规则都没有与源中的任何内容匹配,并且可能是因为您的XML位于命名空间中。那里 - 我调试你的样式表而没有看到一行代码,我希望你留下深刻的印象。试想一下,如果你向我们展示你的代码会有多容易。

答案 1 :(得分:0)

<强>解释

您在浏览器中看到的是浏览器在显示非HTML时显示的内容。

<强>解决方案

以下其中一项:

  1. 将输出保存在文件中(不要使用浏览器执行转换,而是以其他方式调用它 - 比如从命令行调用),然后使用普通文本编辑器查看此文件。

  2. 在XSLT代码中添加HTML元素,这些元素会导致浏览器显示您想要查看的内容。

答案 2 :(得分:0)

在我的第二种情况下,我得到了文本,因为我没有在我的java动作类中将响应类型设置为xml。一旦我设置了它,xsl就会显示我自己的自定义标签和xml中我发送给xsl的标签。

关于我的第一个案例,正如Dimitre Novatchev所说,我们必须使用一些命令,如下面链接中给出的命令。 http://www.biglist.com/lists/xsl-list/archives/199912/msg00082.html

感谢所有人提供的信息。

答案 3 :(得分:0)

您的XSL代码没有根节点“/”的模板,因此没有生成嵌套标记的起点。如果您将模板元素更改为

<xsl:template match="/root">

然后你会看到一些输出。