gpt4 book ai didi

xml - 去除 XSL 模板输出中的 XML 根节点

转载 作者:数据小太阳 更新时间:2023-10-29 02:52:36 25 4
gpt4 key购买 nike

我正在使用 XSL 模板作为 Web 框架的网页模板,最终输出为 XHTML 1.0 Strict;它接受 XML 输入并输出 XHTML。除了一个问题外,它工作得很好——最终输出还输出一个 XML 节点,而不仅仅是内容。这是基本的 XML(缺少一些项目,但总体设计是相同的):

<Page>
<PageScript>
<Script>./js/myscript.js</Script>
</PageScript>
<PageCSS>
<CSS>./css/mycss.css</CSS>
</PageCSS>
<PageContent>Blah blah blah</PageContent>
</Page>

这是XSL模板

<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"
xmlns:response="http://www.ntforl.com/"
xmlns="http://www.w3.org/1999/xhtml"
xmlns:xhtml="http://www.w3.org/1999/xhtml"
xmlns:lang="en">

<xsl:output
method="xml"
doctype-system="http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"
doctype-public="-//W3C//DTD XHTML 1.0 Strict//EN"
/>

<xsl:template match="//PageCSS">
<xsl:for-each select="CSS">
<link type="text/css" rel="stylesheet">
<xsl:attribute name="href">
<xsl:value-of select="." />
</xsl:attribute>
</link>
</xsl:for-each>
</xsl:template>

<xsl:template match="//PageScript">
<xsl:for-each select="Script">
<script type="text/javascript">
<xsl:attribute name="src">
<xsl:value-of select="." />
</xsl:attribute>
</script>
</xsl:for-each>
</xsl:template>

<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()" />
</xsl:copy>
</xsl:template>

<xsl:template match="/" disable-output-escaping="yes">
<html>
<head>
<title>
<xsl:value-of select="//PageTitle" />
</title>
<meta http-equiv="content-type" content="text/html;charset=utf-8" />
<link type="text/css" rel="stylesheet" href="template/style/globalStyle.css" />
<link type="text/css" rel="stylesheet" href="template/style/standards.css" />
<xsl:apply-templates select="//PageCSS" />
<script type="text/javascript" src="template/js/some_file.js"></script>
<xsl:apply-templates select="//PageScript" />
</head>
<body onload="">
<div id="container">
<div id="top">
<div class="clear" />
</div>
<div id="main">
<div class="left" style="width: 708px; margin-top: 10px;">
<h1 class="center">
<xsl:value-of select="//PageTitle" />
</h1>
</div>
<div class="clear" />
<div id="rightPane">
<div id="rightPaneContent">
<xsl:apply-templates select="//PageContent" />
</div>
<img src="template/images/mainBgBottom.png" alt="" />
</div>
</div>
</div>
</body>
</html>
</xsl:template>
</xsl:stylesheet>

问题出在 PageContent 上,而且只发生在 PageContent 上。运行转换时,模板输出

<PageContent xmlns=""> node content </PageContent>

在 XHTML 中。我需要知道如何摆脱它,这样我才能拥有有效的 XHTML 1.0 Strict 文档。

奇怪的是,PageContent 节点是唯一执行此操作的节点,没有其他节点在输出中获取用节点名称包装的内容。这种行为的原因是什么?

最佳答案

您在 PageContent 节点上调用 apply-templates:

<xsl:apply-templates select="//PageContent" />

唯一匹配的模板是这个,所以 PageContent 节点被复制:

<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()" />
</xsl:copy>
</xsl:template>

也许你应该添加另一个匹配 PageContent 的模板,并且只处理子节点,而不复制 PageContent 本身:

<xsl:template match="//PageContent">
<xsl:apply-templates/>
</xsl:template>

关于xml - 去除 XSL 模板输出中的 XML 根节点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1029851/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com