从嵌套标记XSLT访问属性

时间:2013-10-03 11:38:49

标签: xml xslt xpath

我需要访问当前标记下方存在多个图层的标记的属性。

例如: XML的片段如下所示

<Content version="Title" action="add">
  <ProgramContent>
    <ContentMetaData>
      <ContentId>
        <HouseNumber>558960</HouseNumber>
        <AlternateId idType="SeriesId" authoritativeSource="BCM">19714</AlternateId>
        <AlternateId idType="EntityId" authoritativeSource="BCM">550133</AlternateId>
      </ContentId>
     </ContentMetaData>
   </ProgramContent>
</Content>

我的代码目前看起来像这样:

<xsl:for-each select="ns0:BxfMessage/ns0:BxfData/ns0:Content">
   <xsl:if test="string(@version)= 'Title'">
     <xsl:if test="string(//AlternateId[@idType ='SeriesId'])">
       <test>hey</test>
     </xsl:if>
   </xsl:if>
</xsl:for-each>

我需要对内容标记执行for-each循环以检查所有这些循环但是然后在for-each循环中我只想继续操作,如果AlternateID标记的属性不包含seriesId。因此,如果它们中的任何一个是seriesId,我想结束if语句。我该怎么做呢?正如你所看到的,我已经尝试了一个if语句,它应该检查属性idType是否等于SeriesId但是它失败了并且没有返回任何东西,我做错了什么?

干杯

2 个答案:

答案 0 :(得分:2)

所以基本上你想要遍历所有<Content>个没有<AlternateID>元素和idType="SeriesId"元素的元素。

您可以直接在xsl:for-each中执行此操作:

<xsl:for-each select="ns0:BxfMessage/ns0:BxfData/ns0:Content[descendant::ns0:AlternateID/@idType != 'SeriesId']">

答案 1 :(得分:1)

函数string()返回一个字符串,但你想要的是一个布尔值。像test=//AlternateId[contains(@idType, 'SeriesId')]这样的东西应该会更好。