我刚刚进入xslt转换,在完成教程后,我尝试在visual studio 2008中编写一些代码。在链接我需要的xml文档作为输入之后,我尝试了以下代码:
<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" indent="yes"/>
<xsl:template match="/">
<xsl:copy>
<xsl:element name="entry">
<xsl:attribute name="published" >
<xsl:value-of select="entry/published"/>
</xsl:attribute>
<xsl:attribute name="title" >
<xsl:value-of select="title"/>
</xsl:attribute>
<xsl:attribute name="summary" >
<xsl:value-of select="summary"/>
</xsl:attribute>
</xsl:element>
</xsl:copy>
</xsl:template>
这是xml文件的示例:
<entry xmlns:gnip="http://www.p.com/schemas/2010" xmlns="http://www.w3.org/2005/Atom">
<id>tag:search,2005:38587000730689536</id>
<published>2011-02-18T13:13:52Z</published>
<updated>2011-02-18T13:13:52Z</updated>
<title>nachopego (J Ignacio Peña G.) posted a note</title>
<summary type="html">Truculencia: en Nayarit no nada mas
el engrudo se hace bolas</summary>
<category term="StatusPosted" label="Status Posted"/>
<category term="NotePosted" label="Note Posted"/>
<link rel="alternate"
type="text/html" href="http://nachopego/statuses/38587000730689536"/>
答案 0 :(得分:3)
这是xpath和xslt标记中的最常见问题:针对具有默认命名空间的XML文档的XPath表达式。
只需搜索“xpath默认命名空间”,您就会找到很多好的答案。
解决方案:
在XSLT样式表中为XML文档的默认命名空间添加命名空间声明。在此声明中使用前缀(例如)“x:”。
在任何按名称引用元素的XPath表达式中,使用“x:”前缀为每个名称添加前缀。
您的代码:
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:x="http://www.w3.org/2005/Atom" >
<xsl:output method="xml" indent="yes"/>
<xsl:template match="/">
<xsl:copy>
<xsl:element name="entry">
<xsl:attribute name="published" >
<xsl:value-of select="x:entry/x:published"/>
</xsl:attribute>
<xsl:attribute name="title" >
<xsl:value-of select="x:title"/>
</xsl:attribute>
<xsl:attribute name="summary" >
<xsl:value-of select="x:summary"/>
</xsl:attribute>
</xsl:element>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
现在它会产生一些输出。
<强>解释强>:
Xpath始终将未加前缀的名称视为属于“无名称空间”。因此,如果表达式包含名称someName
,XPath会尝试查找名称为someName
且属于“无命名空间”的元素并失败,因为文档中的所有元素都属于非空默认命名空间
解决方案(如上所述) 以使用前缀名称引用名称,其中前缀完全绑定到XML文档的默认命名空间。
答案 1 :(得分:1)
顺便说一句,这段代码
<xsl:element name="entry">
<xsl:attribute name="published" >
<xsl:value-of select="x:entry/x:published"/>
</xsl:attribute>
<xsl:attribute name="title" >
<xsl:value-of select="x:title"/>
</xsl:attribute>
<xsl:attribute name="summary" >
<xsl:value-of select="x:summary"/>
</xsl:attribute>
</xsl:element>
可以更清晰地写成
<entry published="{x:entry/x:published}"
title="{x:title}"
summary="{x:summary}"/>