(XSLT)带属性值的编号标签

时间:2018-09-24 20:26:08

标签: xml xslt xhtml

例如,我得到了这个xhtml文件(https://xsltfiddle.liberty-development.net/bdxtqF):

<html xmlns="http://www.w3.org/1999/xhtml">
<head>

</head>
<body>
    <p>first line</p>
    <p>second line</p>
    <p>third line</p>
    <p>forth line</p>
    <p>fifth line</p>
</body>

我想给p标签编号,但它们的值应视为id属性。我知道您可以使用xsl:number,但是我只知道如何在节点内部进行编号:

    <?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:xs="http://www.w3.org/2001/XMLSchema"
    xpath-default-namespace="http://www.w3.org/1999/xhtml"
    exclude-result-prefixes="#all"
    version="3.0">

   <xsl:template match="body">
       <test>
       <xsl:apply-templates />
       </test>
   </xsl:template>

   <xsl:template match="p">
        <p><xsl:number/>. <xsl:apply-templates /></p>
   </xsl:template>

</xsl:stylesheet>

但是我想要的结果应该是这样

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



<test>
    <p id="1">first line</p>
    <p id="2">second line</p>
    <p id="3">third line</p>
    <p id="4">forth line</p>
    <p id="5">fith line</p>
</test>

如何在标签内创建属性名称并开始为标签内的值编号?预先感谢!

2 个答案:

答案 0 :(得分:2)

您可以在此处使用xsl:attribute来创建属性

<xsl:template match="p">
 <p>
   <xsl:attribute name="id">
     <xsl:number />
   </xsl:attribute>
   <xsl:apply-templates />
 </p>
</xsl:template>

或者,如果您将strip-space添加到样式表中,则可以使用position()

<xsl:strip-space elements="*" />

<xsl:template match="body">
  <test>
    <xsl:apply-templates />
  </test>
</xsl:template>

<xsl:template match="p">
  <p id="{position()}">
    <xsl:apply-templates />
  </p>
</xsl:template>

如果没有strip-spacexsl:apply-templates将选择空白文本节点,这会影响位置。请注意,如果您在body下还有p下的其他元素,那么这将无法获得预期的结果。在这种情况下,您可以执行<xsl:apply-templates select="p" />,但前提是您想忽略其他元素。

答案 1 :(得分:2)

如Tim所示,您可以使用xsl:attribute来构建属性节点,并用xsl:number填充其值。

但是,在XSLT 2或3中,您也可以使用Tim为使用position()而展示的属性值模板方法,而是调用自己的函数,然后将xsl:numberselect一起使用属性:

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:xs="http://www.w3.org/2001/XMLSchema"
    xpath-default-namespace="http://www.w3.org/1999/xhtml"
    xmlns:mf="http://example.com/mf"
    exclude-result-prefixes="#all"
    version="2.0">

   <xsl:function name="mf:number">
       <xsl:param name="node" as="node()"/>
       <xsl:number select="$node"/>
   </xsl:function>

   <xsl:template match="body">
       <test>
       <xsl:apply-templates />
       </test>
   </xsl:template>

   <xsl:template match="p">
       <p id="{mf:number(.)}">
           <xsl:apply-templates/>
       </p>
   </xsl:template>

</xsl:stylesheet>

http://xsltransform.hikmatu.com/eiZQaEL是有效的XSLT 2示例,https://xsltfiddle.liberty-development.net/bdxtqF/1与XSLT 3(https://www.w3.org/TR/xslt-30/#element-number)相同。