2009-09-21 174 views
1

XML/XSL新手一模一样的html代码,所以请原谅我的无知。这是给我的XML输入:XSL获取与XML元素

<entry> 
    <desc> 
     <p>Lorem ipsum <a href="http://www.google.com">dolor</a> sit amet.</p> 
     <p>Lorem <strong>ipsum</strong> dolor sit amet.</p> 
    </desc> 
</entry> 

我必须写一个XSL来得到这样的结果:

<p>Lorem ipsum <a href="http://www.google.com">dolor</a> sit amet.</p> 
<p>Lorem <strong>ipsum</strong> dolor sit amet.</p> 

我想这会工作,在一个输入模板:

<xsl:value-of select="desc"/> 

,但相反,这是上述行的输出:

Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet. 

我是否正确地认为我的系统上必须有其他xsl样式表才能做到这一点?在任何情况下,我都不会读,不能编辑对它们的访问,我可以只添加一种新的样式,所以要解决这个问题我用这个:

<xsl:for-each select="desc/*"> 
    <p><xsl:value-of select="."/></p> 
</xsl:for-each> 

这让我,至少:

<p>Lorem ipsum dolor sit amet.</p><p>Lorem ipsum dolor sit amet.</p> 

但是,正如你所看到的链接和格式已经走了再见!我无法控制那里添加的html元素。任何人都可以提出一种保存格式和所有desc元素的方法吗?该引擎只有XSL 1。提前致谢!

回答

4

您需要复制desc及其所有子元素下的元素。该copy-of XSL元素会为你做到这一点:

<xsl:copy-of select="desc/node()"/> 

这将复制所有的desc的儿童,包括文本节点,以及任何其子元素。

+2

除非你确信''将只包含的元素(没有混合内容),我会“)递减/节点(”推荐使用''而不是,它将抓取元素和文本节点。 – 2009-09-21 19:20:19

+0

@Ben Blank:这个例子只有元素,但你的观点是有效的。我会将其添加到我的答案中。 – Welbog 2009-09-21 19:21:16

+0

谢谢!我明天会在工作中尝试一下,看看它是否给了我想要的输出。 – neobackup08 2009-09-21 20:16:23

0

试试这个:

<?xml version="1.0" encoding="utf-8"?> 
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:template match="/entry/desc"> 
     <xsl:copy-of select="@*|node()"/> 
    </xsl:template> 
</xsl:stylesheet> 
+0

我已经在

模板中,为简洁起见我省略了它们。选择的@ * | node()部分会在这样的模板中工作吗?我承认,我不知道它意味着什么。 – neobackup08 2009-09-21 20:19:48

0

你的选择是不正确。

选择= “降序”

选择= “/项/ desc” 的

http://w3schools.com/xpath/xpath_syntax.asp

节点名称选择指定节点的所有子节点

/从根节点选择

//从当前节点中选择与选择号码 相匹配的文档中的节点

。选择当前节点

..选择当前节点的父

@选择属性

+1

他的选择者显然是对的,否则他根本没有输出。更可能的是,他简单地省略了在他的片段周围建立上下文的'for-each'或'template'声明。 – Welbog 2009-09-21 19:23:51

+0

为了简洁起见,我省略了“输入”模板声明,但是我的选择确实获得了desc元素的值,只是因为我未知的原因而删除了所有格式。 – neobackup08 2009-09-21 20:21:22

+0

我站好了。 – 2009-09-21 21:12:41