我收到第三方提要,我无法确定命名空间,所以我当前不得不在我的XSLT中使用local-name()函数来获取元素值。 但是我需要从一个这样的元素中获取一个属性,并且当命名空间未知时我不知道如何执行此操作(因此需要local-name()函数)。

NB我使用.net 2.0来处理XSLT

以下是XML的示例:

<?xml version="1.0" encoding="UTF-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
   <id>some id</id>
   <title>some title</title>
   <updated>2008-09-11T15:53:31+01:00</updated>
   <link rel="self" href="http://www.somefeedurl.co.uk" />
   <author>
      <name>some author</name>
      <uri>http://someuri.co.uk</uri>
   </author>
   <generator uri="http://aardvarkmedia.co.uk/">AardvarkMedia script</generator>
   <entry>
      <id>http://soemaddress.co.uk/branded3/80406</id>
      <title type="html">My Ttile</title>
      <link rel="alternate" href="http://www.someurl.co.uk" />
      <updated>2008-02-13T00:00:00+01:00</updated>
      <published>2002-09-11T14:16:20+01:00</published>
      <category term="mycategorytext" label="restaurant">Test</category>
      <content type="xhtml">
         <div xmlns="http://www.w3.org/1999/xhtml">
            <div class="vcard">
               <p class="fn org">some title</p>
               <p class="adr">
                  <abbr class="type" title="POSTAL" />
                  <span class="street-address">54 Some Street</span>
                  ,
                  <span class="locality" />
                  ,
                  <span class="country-name">UK</span>
               </p>
               <p class="tel">
                  <span class="value">0123456789</span>
               </p>
               <div class="geo">
                  <span class="latitude">51.99999</span>
                  ,
                  <span class="longitude">-0.123456</span>
               </div>
               <p class="note">
                  <span class="type">Review</span>
                  <span class="value">Some content</span>
               </p>
               <p class="note">
                  <span class="type">Overall rating</span>
                  <span class="value">8</span>
               </p>
            </div>
         </div>
      </content>
      <category term="cuisine-54" label="Spanish" />
      <Point xmlns="http://www.w3.org/2003/01/geo/wgs84_pos#">
         <lat>51.123456789</lat>
         <long>-0.11111111</long>
      </Point>
   </entry>
</feed>

这是XSLT

<?xml version="1.0" encoding="UTF-8" ?>

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:wgs="http://www.w3.org/2003/01/geo/wgs84_pos#" exclude-result-prefixes="atom wgs">
  <xsl:output method="xml" indent="yes"/>

  <xsl:key name="uniqueVenuesKey" match="entry" use="id"/>
  <xsl:key name="uniqueCategoriesKey" match="entry" use="category/@term"/>

  <xsl:template match="/">
    <locations>
      <!-- Get all unique venues -->
      <xsl:for-each select="/*[local-name()='feed']/*[local-name()='entry']">
        <xsl:variable name="CurrentVenueKey" select="*[local-name()='id']" ></xsl:variable>
        <xsl:variable name="CurrentVenueName" select="*[local-name()='title']" ></xsl:variable>
        <xsl:variable name="CurrentVenueAddress1" select="*[local-name()='content']/*[local-name()='div']/*[local-name()='div']/*[local-name()='p'][@class='adr']/*[local-name()='span'][@class='street-address']" ></xsl:variable>
        <xsl:variable name="CurrentVenueCity" select="*[local-name()='content']/*[local-name()='div']/*[local-name()='div']/*[local-name()='p'][@class='adr']/*[local-name()='span'][@class='locality']" ></xsl:variable>
        <xsl:variable name="CurrentVenuePostcode" select="*[local-name()='postcode']" ></xsl:variable>
        <xsl:variable name="CurrentVenueTelephone" select="*[local-name()='telephone']" ></xsl:variable>
        <xsl:variable name="CurrentVenueLat" select="*[local-name()='Point']/*[local-name()='lat']" ></xsl:variable>
        <xsl:variable name="CurrentVenueLong" select="*[local-name()='Point']/*[local-name()='long']" ></xsl:variable>
        <xsl:variable name="CurrentCategory" select="WHATDOIPUTHERE"></xsl:variable>

            <location>
              <locationName>
                <xsl:value-of select = "$CurrentVenueName" />
              </locationName>
              <category>
                <xsl:value-of select = "$CurrentCategory" />
              </category>
              <description>
                  <xsl:value-of select = "$CurrentVenueName" />
              </description>
              <venueAddress>
                <streetName>
                  <xsl:value-of select = "$CurrentVenueAddress1" />
                </streetName>
                <town>
                  <xsl:value-of select = "$CurrentVenueCity" />
                </town>
                <postcode>
                  <xsl:value-of select = "$CurrentVenuePostcode" />
                </postcode>
                <wgs84_latitude>
                  <xsl:value-of select = "$CurrentVenueLat" />
                </wgs84_latitude>
                <wgs84_longitude>
                  <xsl:value-of select = "$CurrentVenueLong" />
                </wgs84_longitude>
              </venueAddress>
              <venuePhone>
                <phonenumber>
                  <xsl:value-of select = "$CurrentVenueTelephone" />
                </phonenumber>
              </venuePhone>
          </location>
        </xsl:for-each>
    </locations>
  </xsl:template>
</xsl:stylesheet>

我正在尝试将$ CurrentCategory变量替换为适当的代码以显示mycategorytext

===============>>#1 票数:13 已采纳

我这里没有XSLT编辑器,但您尝试过使用

*[local-name()='category']/@*[local-name()='term']

===============>>#2 票数:2

根据http://www.w3.org/TR/2006/REC-xml-names-20060816/#scoping-defaulting

“默认命名空间声明不直接应用于属性名称;未加前缀属性的解释由它们出现的元素决定。”

这意味着您的属性不在命名空间中。 只需使用“@term”即可。

为了更清楚一点,不需要使用local-name()来解决这个问题。 处理它的传统方法是在XSLT中声明atom命名空间的前缀,然后在xpath查询中使用它。

你已经在样式表元素上得到了这个声明(xmlns:atom =“http://www.w3.org/2005/Atom”),所以剩下的就是使用它。

正如我已经解释的那样,该属性不受默认命名空间的影响,因此您的代码将如下所示(假设您要添加“xmlns:xhtml =' http//www.w3.org/1999/xhtml ' “):

      <xsl:for-each select="/atom:feed/atom:entry">
        <xsl:variable name="CurrentVenueKey" select="atom:id" />
        <xsl:variable name="CurrentVenueName" select="atom:title" />
        <xsl:variable name="CurrentVenueAddress1" 
             select="atom:content/xhtml:div/xhtml:div/xhtml:p[@class='adr']/xhtml:span[@class='street-address']" />
        <xsl:variable name="CurrentVenueCity" 
             select="atom:content/xhtml:div/xhtml:div'/xhtml:p[@class='adr']/xhtml:span[@class='locality'] />
...
        <xsl:variable name="CurrentCategory" select="atom:category/@term" />

..... 

如果你真的不知道你正在转换的XML的结构,local-name()会非常有用,但在这种情况下,如果你收到的东西不是你所期望的,那么无论如何它都会破坏。

===============>>#3 票数:0

我不确定为什么你必须使用local-name(),但是如果你分享一些关于你使用的xslt处理器以及语言的更多信息,那我就可以理解了。 我说这个b / c你应该可以这样做:

<xsl:stylesheet xmlns="http://www.w3.org/2005/Atom" ..>

<xsl:template match="feed">
  <xsl:apply-templates />
</xsl:template>

<xsl:template match="entry">
  ... 
  <xsl:variable name="current-category" select="category/@term" />
  ...
</xsl:template>

我希望帮助你的两件事是顶部的xmlns声明没有前缀。 这将设置默认命名空间,因此您不必使用命名空间前缀。 同样,您可以调用do'xmlns:a =“http://www.w3.org/2005/Atom”'然后执行'select =“a:feed”'。 另一件需要注意的事情是使用选择属性的'@term'。 如果你想匹配任何属性'@ *'就像它对元素一样。

同样,根据处理器的不同,可能还有其他有用的工具供您使用,因此如果您可以提供更多信息,它可能会有所帮助。 此外, XSL邮件列表可能是另一个有用的资源。

  ask by Anthony Main translate from so

未解决问题?本站智能推荐:

3回复

XSLT中的命名空间

我正在使用XSLT重构XML文件。 以下代码将所有子节点复制到新的XML文件: 我想修改代码,以便将节点放入不在源文档中的特定命名空间。 我需要改变什么?
2回复

XSLT使用命名空间转换XML

我正在尝试使用XSLT将一些XML转换为HTML 。 问题: 我无法让它发挥作用。 有人能告诉我我做错了什么吗? XML: XSLT:
1回复

在XSLT之后出现未使用的命名空间声明

在搜索网络寻找答案后,提出“几乎”解决方案......我决定将问题简化为一个非常简单的案例。 请考虑以下XML代码段: 请注意, p元素是XHTML的命名空间,这是此doc的默认命名空间。 现在考虑以下简单的样式表。 我想创建一个XHTML文档,其中包含me:element
1回复

XSLT和XSLFO命名空间

我有XSL命名空间的以下问题。 我使用带有一个XSL文件和一个XML文件的FOP生成PDF。 这是我的XML文件: 这是我的XSL文件: 我需要包含名称空间yt: 当我在xml中这样做时: 它完美地运作。 但在现实生活中,我无法将命名空间添加到我的xml
3回复

xslt问题(命名空间?)

我有一个像这样的文件: 我应该只提取我尝试过的身体内容: 但这不起作用
2回复

命名空间停止XSLT工作

我有一个看起来像这样的XSLT: 这是输入: 由于<Response xmlns="http://www.castiron.com/response">标记中的名称空间,这导致整个XSLT也失败。 是否有可能取消命名空间的限制,以便XSLT能够正常工作。 如果删除
1回复

XSLT附录命名空间CFDI

我有下一个附录: 我的问题是在节点: 因为当我运行addenda时,命名空间是: 它放在节点的位置,我在这个地方不需要这个名称空间。 这样: 我需要这种方式: 有什么建议么????? 我尝试添加以下说明: 并且此指令有效,但是当此XSLT
1回复

在将命名空间添加到xml时,使用xslt解析xml失败

我有以下xml文件: 我想使用以下xslt解析: xslt按预期工作,但是当我将xmlns属性添加到xml的top元素时,它无法找到xml元素。 我在这个网站上看到了一些相关的问题,但仍然没有弄清楚如何解决我的具体问题。 我尝试将doc:添加到此处建议的选择中,但它没有帮助。
1回复

XSLT:匹配具有命名空间的元素不起作用

我正在尝试使用XSLT将XML歌曲歌词数据库转换为HTML。 我的XML像这样开始: 从其他帖子中知道,我需要将上述名称空间添加到我的XSLT中。 我尝试过,而我的XSLT看起来像这样: 不幸的是,此代码仍无法正常工作。 仅当我消除XML中的xmlns条目并直接匹配“歌曲”
1回复

使用XSLT将多个命名空间添加到SOAP XML消息中

我有一个SOAP请求,正在尝试使用XSLT进行转换。 我想向请求中的每个元素添加名称空间限定符。 我需要用户使用两种不同的名称空间。 这是我要转换的XML: 这是我想将其转换为: 这是我的样式表 这是我得到的结果。 我不知道为什么我在后代中得到了空的名称空间