XML中的默认命名空间的XSLT问题

时间:2013-06-19 18:51:37

标签: xml xslt

这是美发的东西! :)

从以下XML文档中获取这两个节点值需要什么?

<?xml version="1.0" encoding="utf-8"?>
<AlarmSummaryMessage 
  xmlns:cbrn="http://www.site.com/cbrn" 
  xmlns:nc="http://www.site.com/nc" 
  xmlns:scr="http://www.site.com/src"
  xmlns="http://www.site.com/xmlns" xmlns:em="http://www.site.com/em">
  <MessageContent detectionEventKindCode="encounter">
    <AlarmingDevice>
      <EncounterDeviceID>Raid-WTC</EncounterDeviceID>
      <cbrn:EncounterDeviceID2>Raid-WTC</cbrn:EncounterDeviceID2>
    </AlarmingDevice>
  </MessageContent>
</AlarmSummaryMessage>

使用以下XSLT:

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

  <xsl:output method="text" indent="no"/>

  <xsl:template match="MessageContent">
    <xsl:text>DEVICE: </xsl:text>
    <xsl:value-of select="AlarmingDevice/EncounterDeviceID/text()"/>
  </xsl:template>

  <xsl:template match="AlarmSummaryMessage">
    <xsl:apply-templates select="MessageContent" />         
  </xsl:template>
</xsl:stylesheet>

2 个答案:

答案 0 :(得分:1)

除非我误解了你的问题,否则我相信你只是在寻找以下内容:

<xsl:value-of select="/MessageContent/AlarmingDevice/EncounterDeviceID"/>
<xsl:value-of select="/MessageContent/AlarmingDevice/cbrn:EncounterDeviceID2"/>

答案 1 :(得分:1)

因为您的XML元素属于命名空间,所以您必须在XSLT中提及该命名空间 - 以下内容将帮助您入门:

<?xml version="1.0" encoding="utf-8"?>
    <xsl:stylesheet version="1.0"
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:tns="http://www.site.com/xmlns"
    xmlns:cbrn="http://www.site.com/cbrn">

        <xsl:output method="text" indent="no"/>

    <xsl:template match="tns:MessageContent" priority="2">
        <xsl:text>DEVICE:
        </xsl:text>
        <xsl:value-of select="tns:AlarmingDevice/tns:EncounterDeviceID"/>
        <xsl:text>; </xsl:text>
        <xsl:value-of select="tns:AlarmingDevice/cbrn:EncounterDeviceID2"/>
    </xsl:template>

    <xsl:template match="/tns:AlarmSummaryMessage" priority="1">
        <xsl:apply-templates select="tns:MessageContent" />         
    </xsl:template>
</xsl:stylesheet>

请注意xsl:stylesheet标记中的命名空间定义以及节点名称前面的前缀。