根据xml标记的属性值显示输出

时间:2015-03-03 12:40:10

标签: xml xslt xslt-1.0

<?xml version="1.0" encoding="UTF-8"?>

<provinces>
 <name num="5">Alberta</name>
 <name num="3">British</name>
 <name num="1">Manitoba</name>
 <name num="4">New Brunswick</name>
 <name num="2">Newfoundland</name>
</provinces>

我希望输出为

1. Manitoba
2. Newfoundland  
3. British
4. New Brunswick
5. Alberta

我正在使用以下xslt

<?xml version="1.0" encoding="US-ASCII"?>
<xsl:stylesheet version="1.0"
  xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output method="text" />

  <xsl:template match="provinces">
    <xsl:apply-templates select="name" />
  </xsl:template>

  <xsl:template match="name">
    <xsl:value-of select="position()" />
    <xsl:text>. </xsl:text>
    <xsl:value-of select="." />
  </xsl:template>

</xsl:stylesheet>

我知道这种做法并没有给出我想要的输出,但到目前为止我已经得到了。

我想根据属性“num”值来定位它们我该怎么做?

1 个答案:

答案 0 :(得分:1)

  

我想根据属性&#34; num&#34;来定位它们。我该怎么做?

这种操作称为排序。您需要在xsl:apply-templates内对输入元素进行排序:

<xsl:apply-templates select="name">
    <xsl:sort select="@num"/>
</xsl:apply-templates>

另外,为了避免将所有文本放在一行上,如果当前name节点不是最后一个节点,则输出换行符。

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" />

  <xsl:template match="provinces">
    <xsl:apply-templates select="name">
        <xsl:sort select="@num" data-type="number"/>
    </xsl:apply-templates>
  </xsl:template>

  <xsl:template match="name">
    <xsl:value-of select="concat(position(),'. ')" />
    <xsl:value-of select="." />
    <xsl:if test="position() != last()">
        <xsl:text>&#10;</xsl:text>
    </xsl:if>
  </xsl:template>

</xsl:stylesheet>

文字输出

1. Manitoba
2. Newfoundland
3. British
4. New Brunswick
5. Alberta