如何获取所有具有相同名称的元素的所有相同命名的属性

时间:2013-03-31 11:23:01

标签: xslt xpath

我有一个像下面的xml,我想知道如何在同一节点下输出所有属性。

 <?xml version="1.0" encoding="utf-8"?>
   <Person ID="1234">
      <NAME>Louis  //</NAME>
      <SEX>M</SEX>
      <BIRT>
         <DATE>15 SEP 1980</DATE>
         <PLAC>UK</PLAC>
      </BIRT>
      <FAMS REF="F523"/>
      <FAMS REF="F524"/>
      <FAMC REF="F521"/>
   </INDI>

我想输出FAMS和FAMC,如下所示: FAMS:F523,F524 FAMC:F521

谢谢, 劳伦斯

3 个答案:

答案 0 :(得分:1)

此转化

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output method="text"/>

 <xsl:template match="/*">
  <xsl:apply-templates select="FAMS[1]"/>
  <xsl:apply-templates select="FAMC[1]"/>
 </xsl:template>

 <xsl:template match="FAMS|FAMC">
  <xsl:value-of select="name()"/>: <xsl:text/>
  <xsl:apply-templates select="../*[name()=name(current())]/@REF"/>
  <xsl:text>&#xA;</xsl:text>
 </xsl:template>

 <xsl:template match="@REF">
  <xsl:if test="not(position() =1)">, </xsl:if>
  <xsl:value-of select="."/>
 </xsl:template>
</xsl:stylesheet>

应用于提供的(并更正为格式良好的)XML文档时:

<Person ID="1234">
    <NAME>Louis  //</NAME>
    <SEX>M</SEX>
    <BIRT>
        <DATE>15 SEP 1980</DATE>
        <PLAC>UK</PLAC>
    </BIRT>
    <FAMS REF="F523"/>
    <FAMS REF="F524"/>
    <FAMC REF="F521"/>
</Person>

会产生想要的正确结果:

FAMS: F523, F524
FAMC: F521

答案 1 :(得分:0)

匹配元素x的所有属性的XPath是x/@*,或者当前(上下文)节点是@*

答案 2 :(得分:0)

路径为FAMS/@REF

<xsl:template match="Person">
  <xsl:apply-templates select="FAMS/@REF"/>
</xsl:template>

<xsl:template match="FAMS/@REF">
  <xsl:if test="position() &gt; 1">, </xsl:if>
  <xsl:value-of select="concat('FAMS> ', .)"/>
</xsl:template>