0

我希望有人可以帮助我解决这个我目前找不到解决方案的问题。我第一次使用 XSLT 来转换一些 XML。我发现的问题是使用模板来获取具有属性值的Message元素。顺便说一句,我没有生成 XML,也无法更改其结构

    <?xml version="1.0" encoding="UTF-8"?>
    <ns1:Message >
    <ns1:Notification> 
        <ns22:Message>
        <ns1:Message value="timestamp">
        </ns1:Message>
        </ns22:Message>
    </ns1:Notification>
    </ns1:Message>
4

2 回答 2

1

假设您给出的示例中缺少名称空间声明,您可以使用 XSLT 访问时间戳,如下所示:

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0"
  xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
  xmlns:ns1="http://ns1.com/"
  xmlns:ns22="http://ns22.com/"> 
  <xsl:template match="/">
    <xsl:value-of select="/ns1:Message/ns1:Notification/ns22:Message/ns1:Message/@value"/>
  </xsl:template>
</xsl:stylesheet>

我显然只是为命名空间编造了一些 url,但你明白了。

如果您的 XML 文档确实缺少名称空间声明,那么它的格式不正确,在这种情况下,我认为您无能为力。

于 2013-05-13T16:46:54.223 回答
0

我已经解决了我的问题,感谢詹姆斯的帮助。您的回答非常有见地,并帮助您弄清楚了。我试图避免使用命名空间并给出直接路径,如

  <xsl:value-of select="/Message/Notification/Message/Message/@value"/>

它让我得到我想要的数据。但是我试图做一些更花哨的东西,比如

我想强调一下,路径上的命名空间并没有让我得到我文件上的数据这可能不是每个人的情况

        <xsl:template match="Item">   
      <xsl:if test="@Name = 'Token'">
                <xsl:value-of select="@Value"/>   
          </xsl:if>
      </xsl:template> 

它适用于项目元素

        <?xml version="1.0" encoding="UTF-8"?>
        <ns1:Message >
            <ns1:Notification> 
              <ns22:Message>
               <ns1:Message value="timestamp">
                 <ns1:item Token=1643512>
                 <ns1:item Token2=44553512>
                   </ns1:Message>
                </ns22:Message>
             </ns1:Notification>
               </ns1:Message>

所以制作一个模板来到达那个Message标签是我没有设法开始工作的。尽管上面的解决方案是获得我想要的东西的好方法。如果有人可以让我知道为什么以与上述类似的方式制作模板以获取 Message 标签不起作用并破坏整个 xslt。谢谢大家提前

于 2013-05-14T10:29:46.587 回答