xslt转换返回空值

时间:2011-02-21 03:41:30

标签: xslt xpath

我刚刚进入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&#xF1;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"/>

2 个答案:

答案 0 :(得分:3)

这是xpath和xslt标记中的最常见问题:针对具有默认命名空间的XML文档的XPath表达式。

只需搜索“xpath默认命名空间”,您就会找到很多好的答案。

解决方案

  1. 在XSLT样式表中为XML文档的默认命名空间添加命名空间声明。在此声明中使用前缀(例如)“x:”。

  2. 在任何按名称引用元素的XPath表达式中,使用“x:”前缀为每个名称添加前缀。

  3. 您的代码

    <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}"/>