2010-05-25 77 views
2

下的所有文本(包括节点名称),我现在有一个XML文件是这样的:我想选择一个节点

<aaa> 
    <b>I am a <i>boy</i></b>. 
</aaa> 

我怎样才能得到确切的字符串:<b>I am a <i>boy</i></b>.?谢谢。

+0

你必须使用xslt吗?怎么样xml解析器+ xpath? – 2010-05-25 01:45:40

+0

请不要将标签(如“[xslt]”)放入标题行。这就是标签的用途。 – 2010-05-25 01:55:18

+0

好问题(+1)。请参阅我的回答以获得解释和完整但简短的解决方案。 :) – 2010-05-25 02:23:07

回答

2

您必须告诉XSLT您也想要复制元素。这可以通过附加规则来完成。请注意,我在apply-templates元素上使用自定义选择子句来选择属性以及所有节点类型对象。还要注意,aaa的规则优先,并且而不是将aaa元素本身复制到输出。

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:template match="aaa"> 
    <xsl:apply-templates select="@*|node()"/> 
    </xsl:template> 
    <xsl:template match="@*|node()"> 
    <xsl:copy> 
     <xsl:apply-templates select="@*|node()"/> 
    </xsl:copy> 
    </xsl:template> 
</xsl:stylesheet> 
2
<aaa> 
    <b>I am a <i>boy</i></b>. 
</aaa> 

我怎样才能得到确切的字符串: <b>I am a <i>boy</i></b>

你的情况要做到这一点,最简单的/最简单的办法是输出以下XPath表达式结果:

/*/node()

这意味着:“选择所有节点是顶级元素的子节点。“

当然,有一些我们不希望选择的纯空白文本节点,但XSLT可以处理这个问题,所以XPath表达式就像上面所示的那样简单。

现在,为了得到与XSLT转换的结果,我们使用以下

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:output omit-xml-declaration="yes"/> 
<xsl:strip-space elements="*"/> 

<xsl:template match="/"> 
    <xsl:copy-of select="/*/node()"/> 
</xsl:template> 
</xsl:stylesheet> 

当这种变换所提供的XML文档应用,想要的结果产生

<b>I am a <i>boy</i></b>. 

请注意

  1. 使用该<xsl:copy-of> XSLT指令(未<xsl:value-of>),其拷贝节点,不字符串值。

  2. 使用<xsl:strip-space elements="*"/> XSLT指令,指示XSLT处理器忽略XML文档中任何只包含空白的文本节点。

+0

这表明:XSLT可以做XPath可以做的任何事情。 :-)请注意,使用此方法会失去递归可调性。 – 2010-05-25 02:29:00

+0

它缺少“。”。xpath应该是这样的:'',它会被序列化为输出,形成,但是被要求的字符串。 – 2010-05-25 02:34:49

+0

@ Mads-Hansen:谢谢,我没有注意到“。” - 以为这是一个标题结束问题中的句子。 我相应地更新了我的答案。 – 2010-05-25 03:44:19