首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >一旦应用XSLT模板

一旦应用XSLT模板
EN

Stack Overflow用户
提问于 2014-06-11 12:34:53
回答 3查看 346关注 0票数 0

我有一个xml

代码语言:javascript
复制
<root>
    <foo>Hello</foo>
    <bar>World</bar>
</root>

和模板

代码语言:javascript
复制
<xsl:template match="foo">
    <div>
        <span><xsl:value-of select="." /></span>
        <xsl:apply-templates select="//bar" mode="inner" />
    </div>
</xsl:template>

<xsl:template match="bar">
    <span><xsl:value-of select="." /></span>
</xsl:template>

<xsl:template match="bar" mode="inner">
    <span><xsl:value-of select="." /></span>
</xsl:template>

期望

代码语言:javascript
复制
<div>
    <span>Hello</span>
    <span>World</span>
</div>

实际

代码语言:javascript
复制
<div>
    <span>Hello</span>
    <span>World</span>
</div><span>World</span>

我没有可能阻止块条的输出。此模板用于其他地方。

代码语言:javascript
复制
<xsl:template match="bar" />

-编辑--

我不能覆盖根模板(这是一个不同的抽象级别)

代码语言:javascript
复制
<xsl:template match="/root">
    <xsl:apply-templates />
</xsl:template>

我不能阻止模板条的使用,因为它是必要的。

代码语言:javascript
复制
<root>
    <bar>World</bar>
</root>

期望

代码语言:javascript
复制
<span>World</span>

-真实的例子--

模板

代码语言:javascript
复制
<?xml version="1.0" encoding="UTF-8" ?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:output
    method="xml"
    version="1.0"
    doctype-public="-//W3C//DTD XHTML 1.0 Transitional//EN"
    doctype-system="http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"
    omit-xml-declaration="yes"
    media-type="text/html"
    encoding="utf-8"
    indent="yes"
/>

<xsl:template match="/root">
    <html>
    <head></head>
    <body>
        <xsl:apply-templates select="block[@place='main']"/>
    </body>
    </html>
</xsl:template>

<xsl:template match="block/page">
    <div class="page-second">
        <xsl:apply-templates select="//block/news" mode="inner" />
        <div class="info">
            <h1><xsl:value-of select="title" /></h1>
            <xsl:value-of select="text" />
        </div>
    </div>
</xsl:template>

<xsl:template match="block/news">
    <div class="clear" />
    <div class="news-block">
        <h2><xsl:value-of select="title" /></h2>
        <ul>
            <xsl:apply-templates select="article" />
        </ul>
    </div>
</xsl:template>

<xsl:template match="block/news" mode="inner">
    <div class="news-block">
        <h2><xsl:value-of select="title" /></h2>
        <ul>
            <li><a href="{article/link}"><xsl:value-of select="article/title" /></a></li>
        </ul>
    </div>
</xsl:template>

<xsl:template match="block/news/article">
    <li><a href="{link}"><xsl:value-of select="title" /></a></li>
</xsl:template>

</xsl:stylesheet>

xml 1

代码语言:javascript
复制
<root>
    <block place="main">
        <page>
            <title>Page title</title>
            <text>Page text</text>
        </page>
    </block>
    <block place="main">
        <news>
            <title>News title</title>
            <article>
                <title>Article 1 title</title>
                <link>/article-1/</link>
            </article>
            <article>
                <title>Article 2 title</title>
                <link>/article-2/</link>
            </article>
        </news>
    </block>
</root>

预期结果1

代码语言:javascript
复制
<html>
<head></head>
<body>
<div class="page-second">
    <div class="news-block">
        <h2>News title</h2>
        <ul>
            <li><a href="/article-1/">Article 1 title</a></li>
        </ul>
    </div>
    <div class="info">
        <h1>Page title</h1>
        Page text
    </div>
</div>
</body>
</html>

xml 2

代码语言:javascript
复制
<root>
    <block place="main">
        <news>
            <title>News title</title>
            <article>
                <title>Article 1 title</title>
                <link>/article-1/</link>
            </article>
            <article>
                <title>Article 2 title</title>
                <link>/article-2/</link>
            </article>
        </news>
    </block>
</root>

结果2

代码语言:javascript
复制
<html>
<head></head>
<body>
<div class="clear" />
<div class="news-block">
    <h2>News title</h2>
    <ul>
        <li><a href="/article-1/">Article 1 title</a></li>
        <li><a href="/article-2/">Article 2 title</a></li>
    </ul>
</div>
</body>
</html>
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2014-06-11 16:54:00

查看简单的"foo/bar“示例,您是说当存在"foo”时,您希望对后续的"bar“信封进行一些不同的处理,并且不希望在选择根的子元素时应用"bar”的其他模板。

在这种情况下,您所需要做的就是向XSLT添加模板,如果有"foo“元素,则忽略"bar”元素(因为在这种情况下,匹配"foo“的模板正在用另一个模板处理它们)。

代码语言:javascript
复制
<xsl:template match="bar[../foo]" />

现在,在您的实际示例中,"foo“元素是”块“元素,"page”元素作为子元素,"bar“元素是”块“元素,"news”元素作为子元素。这意味着您只需要将此模板添加到现有的XSLT中。

代码语言:javascript
复制
<xsl:template match="block[news][../block/page]" />

或者这个,如果"place“属性很重要的话

代码语言:javascript
复制
<xsl:template match="block[@place='main'][news][../block[@place='main']/page]" />

因此,它有“页面”和“新闻”项,这将停止<xsl:apply-templates />在“根”模板中正常处理“新闻”项目。

所有其他XSLT都可以保持原样,只需将上面的模板添加到其中,就可以了。

票数 1
EN

Stack Overflow用户

发布于 2014-06-11 12:47:57

你应该做以下几点:

代码语言:javascript
复制
<xsl:template match="/">            
   <xsl:apply-templates select="//foo"/>
</xsl:template>
<xsl:template match="foo">
   <div>
      <span><xsl:value-of select="." /></span>
      <xsl:apply-templates select="//bar" mode="inner" />
   </div>
</xsl:template>

<xsl:template match="bar">
   <span><xsl:value-of select="." /></span>
</xsl:template>

<xsl:template match="bar" mode="inner">
   <span><xsl:value-of select="." /></span>
</xsl:template>

第一个模板(matches /)将在根级执行,如果不需要子元素,则不解析它们。您的解决方案解析了所有内容,并将正确的模板与其关联起来。

票数 4
EN

Stack Overflow用户

发布于 2014-06-11 13:01:10

代码语言:javascript
复制
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="root">
<div>
<xsl:apply-templates/>
</div>
</xsl:template>

<xsl:template match="foo|bar">
<span>
<xsl:apply-templates/>
</span>
</xsl:template>
</xsl:stylesheet>
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24163083

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档