我有一个XML文件,我想在两个单独的网页上显示,有两个不同的样式表。问题是样式表是在XML文件中指定的,通常会将其排除在外。我试图通过从转换本身拆分数据并将其作为单独的文件包含来解决这个问题。像这样:
<?xml version="1.0" encoding="utf-8"?>
<?xml-stylesheet href="news.xsl" type="text/xsl"?>
<!DOCTYPE doc [
<!ENTITY items SYSTEM "news_items.xml">
]>
<wrapper>
&items;
</wrapper>
这里news_items.xml是一个纯XML文件,没有标题,还有一个根节点,如下所示:
<items>
<item>
---
</item>
<item>
---
</item>
<item>
---
</item>
</items>
样式表news.xsl遍历重复节点,并生成格式良好的输出。这种安排允许我用不同的样式表重复练习,而不重复数据。它适用于Chrome,但不适用于IE或我定位的任何webkit浏览器。
有更好的方法吗?我希望能够使用单个XML文件,因为内容非常动态。
后来:我实际上是在服务器端使用PHP XSLTProcessor类解决了这个问题。根据提出的问题条款,这不是一个选项,为此我道歉。这不是我特别熟悉的领域,即使他们提交了一个完美的解决方案,我也无法向所有人颁发赏金。对不起。
答案 0 :(得分:7)
您可以使用虚拟XML文件,而不包含包含样式表调用的实际数据:
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="YOUR_STYLESHEET.xsl"?>
<root/>
样式表本身不使用虚拟数据,而是通过“document()”获取实际数据:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/">
<xsl:apply-templates select="document('YOUR_DATA_FILE.xml')/YOUR_XPATH"/>
</xsl:template>
...use templates to do something...
</xsl:stylesheet>
答案 1 :(得分:3)
您可以参数化XSLT模板,并且基于XSLT参数,您可以应用此模板或该模板(xsl:call-template
)。
<xsl:param name="style" select="defaultStyle"/>
<xsl:template name="adjustStyle" match="/">
<xsl:choose>
<xsl:when test="$style = 'defaultStyle'">
<xsl:call-template ...>
</xsl:when>
<xsl:otherwise>
<xsl:call-template ...>
</xsl:otherwise>
</xsl:choose>
</xsl:template>
答案 2 :(得分:0)
我没有评论的声誉,但这是对评论中的问题的回应。
如果您有权访问样式表,则可以使用<xsl:template match="<INSTERT ELEMENT HERE">
为xml文件的特定部分指定样式。 Here是一些文档。这样,您不需要包含单独的文件,只需在同一个XSL文件中创建多个模板。
答案 3 :(得分:0)
1)对于相同的xml有不同的样式表,所以它变成
<html>
<head>
link to your conditional stylesheet
</head>
<body>
Your transformed html from xml that remains same in both conditions
</body>
2)使用条件生成不同的输出: -
<xsl:if test="your condition in xml">