我有一个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”
感谢。
答案 0 :(得分:4)
这可能是因为您的模板规则都没有与源中的任何内容匹配,并且可能是因为您的XML位于命名空间中。那里 - 我调试你的样式表而没有看到一行代码,我希望你留下深刻的印象。试想一下,如果你向我们展示你的代码会有多容易。
答案 1 :(得分:0)
<强>解释强>:
您在浏览器中看到的是浏览器在显示非HTML时显示的内容。
<强>解决方案强>:
以下其中一项:
将输出保存在文件中(不要使用浏览器执行转换,而是以其他方式调用它 - 比如从命令行调用),然后使用普通文本编辑器查看此文件。
在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">
然后你会看到一些输出。