下的所有文本(包括节点名称),我现在有一个XML文件是这样的:我想选择一个节点
<aaa>
<b>I am a <i>boy</i></b>.
</aaa>
我怎样才能得到确切的字符串:<b>I am a <i>boy</i></b>.
?谢谢。
下的所有文本(包括节点名称),我现在有一个XML文件是这样的:我想选择一个节点
<aaa>
<b>I am a <i>boy</i></b>.
</aaa>
我怎样才能得到确切的字符串:<b>I am a <i>boy</i></b>.
?谢谢。
您必须告诉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>
<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>.
请注意:
使用该<xsl:copy-of>
XSLT指令(未<xsl:value-of>
),其拷贝节点,不字符串值。
使用<xsl:strip-space elements="*"/>
XSLT指令,指示XSLT处理器忽略XML文档中任何只包含空白的文本节点。
这表明:XSLT可以做XPath可以做的任何事情。 :-)请注意,使用此方法会失去递归可调性。 – 2010-05-25 02:29:00
它缺少“。”。xpath应该是这样的:'
@ Mads-Hansen:谢谢,我没有注意到“。” - 以为这是一个标题结束问题中的句子。 我相应地更新了我的答案。 – 2010-05-25 03:44:19
你必须使用xslt吗?怎么样xml解析器+ xpath? – 2010-05-25 01:45:40
请不要将标签(如“[xslt]”)放入标题行。这就是标签的用途。 – 2010-05-25 01:55:18
好问题(+1)。请参阅我的回答以获得解释和完整但简短的解决方案。 :) – 2010-05-25 02:23:07