从同一xml标记中选择两个属性

时间:2018-08-08 06:32:16

标签: xml xslt

我有这种格式的xml:

<xml>
    <cases total="3">
        <case>
            <ref>3</ref>
        </case>
        <case>
            <ref>1</ref>
        </case>
        <case>
            <ref>2</ref>
        </case>
    </cases>
</xml>

现在,我希望xsl将打印<cases total="value">,然后根据每种情况的参考进行排序。 所需的输出:

<xml>
    <cases total="3">
        <case>
            <ref>1</ref>
        </case>
        <case>
            <ref>2</ref>
        </case>
        <case>
            <ref>2</ref>
        </case>
    </cases>
</xml>

我当前的xslt看起来像这样-

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <!-- identity template -->
    <xsl:template match="node()|@*">
        <xsl:copy>
            <xsl:apply-templates select="node()|@*" />
        </xsl:copy>
    </xsl:template>

<xsl:template match="cases">
  <xsl:copy>
    <xsl:apply-templates select="case">
        <xsl:sort select="ref" />
    </xsl:apply-templates>
  </xsl:copy>
</xsl:template>
</xsl:stylesheet>

这完成了工作,但是没有显示案例标签的“ TOTAL”值。

1 个答案:

答案 0 :(得分:0)

假设输入的XML没有total的属性<cases>,并且XML根据注释包含以下数据

<xml>
    <cases>
        <case>
            <ref>3.10</ref>
        </case>
        <case>
            <ref>3.1</ref>
        </case>
        <case>
            <ref>1</ref>
        </case>
        <case>
            <ref>1.0</ref>
        </case>
        <case>
            <ref>2.1</ref>
        </case>
        <case>
            <ref>2</ref>
        </case>
    </cases>
</xml>

您需要对模板进行以下更改以添加属性total

<xsl:template match="cases">
    <xsl:copy>
        <xsl:attribute name="total">
            <xsl:value-of select="count(case)" />
        </xsl:attribute>
        <xsl:apply-templates select="case">
            <xsl:sort select="ref" datatype="text" />
        </xsl:apply-templates>
    </xsl:copy>
</xsl:template>

这将输出显示为

<xml>
    <cases total="6">
        <case>
            <ref>1</ref>
        </case>
        <case>
            <ref>1.0</ref>
        </case>
        <case>
            <ref>2</ref>
        </case>
        <case>
            <ref>2.1</ref>
        </case>
        <case>
            <ref>3.1</ref>
        </case>
        <case>
            <ref>3.10</ref>
        </case>
    </cases>
</xml>