使用XSLT来获取具有相同名称的结构化元素中的属性值

时间:2013-05-13 16:22:55

标签: xml xslt

我希望有人可以帮我解决这个问题,目前我找不到任何解决方案。 我第一次使用XSLT来转换一些XML。我发现的麻烦是使用模板来获取带有属性值的消息元素。 顺便说一句,我没有生成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>

2 个答案:

答案 0 :(得分: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>

我显然只是为命名空间编写了一些网址,但是你得到了一般的想法。

如果您的XML文档确实缺少名称空间声明,那么它就没有很好地形成,在这种情况下我认为您无法用它做任何事情。

答案 1 :(得分:0)

我已经解决了我的问题,感谢James的帮助。你的答案非常有见地,并帮助解决了问题。我试图避免使用命名空间并在

中给出直接路径
  <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> 

它适用于 item 元素

        <?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标签不起作用,打破整个xslt 。谢谢大家提前