使用XSLT插入元素的ID

时间:2017-04-10 11:59:37

标签: xml xslt

我需要将xml转换为另一种xml格式,我需要为父元素journalcontent按序列顺序为所有部分和章节提供id。

<?xml version="1.0" encoding="UTF-8"?>
 <book>
   <footnote>
 <journal>
     <section>Fir</section> sum <chapter>sec</chapter>
   </journal>
</footnote>

 <footnote>
   <journal>
      <section>thir</section> sum <chapter>four</chapter>
   </journal>
</footnote>

<footnote>
   <journal>
      <section>ff</section> sum <chapter>66</chapter>
  </journal>
   </footnote>
</book>

我在xslt下面试过,但输出不是核心

<?xml version="1.0" encoding="UTF-8"?>
   <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0">
    <xsl:template match="book">
       <book>
           <xsl:apply-templates/>
        </book>
    </xsl:template>
    <xsl:template match="//footnote">
          <xsl:variable name="seq">
            <xsl:number format="001" level="any"/>
        </xsl:variable>
        <xsl:for-each select="journal">
            <xsl:if test="section">
                <journalcontent>
                    <xsl:attribute name="id">
                        <xsl:value-of select="$seq"/>
                     </xsl:attribute>
                     <xsl:copy-of select="section"/>
                 </journalcontent>
            </xsl:if>
            <xsl:if test="chapter">
                <journalcontent>
                    <xsl:attribute name="id">
                        <xsl:value-of select="$seq"/>
                    </xsl:attribute>
                    <xsl:copy-of select="chapter"/>
                </journalcontent>
            </xsl:if>
        </xsl:for-each>
    </xsl:template>
</xsl:stylesheet>

我得到了以下输出

<?xml version="1.0" encoding="UTF-8"?><book>
  <journalcontent id="001"><section>Fir</section></journalcontent>
  <journalcontent id="001"><chapter>sec</chapter></journalcontent>
  <journalcontent id="002"><section>thir</section></journalcontent>
  <journalcontent id="002"><chapter>four</chapter></journalcontent>
   <journalcontent id="003"><section>ff</section></journalcontent>
  <journalcontent id="003"><chapter>66</chapter></journalcontent>
</book>

我希望输出为下面提到的唯一ID

   <?xml version="1.0" encoding="UTF-8"?>
   <book>
       <journalcontent id="001"><section>Fir</section></journalcontent>
       <journalcontent id="002"><chapter>sec</chapter></journalcontent>
       <journalcontent id="003"><section>thir</section></journalcontent>
       <journalcontent id="004"><chapter>four</chapter></journalcontent>
      <journalcontent id="005"><section>ff</section></journalcontent>
     <journalcontent id="006"><chapter>66</chapter></journalcontent>
   </book>

任何人都试图帮助我

1 个答案:

答案 0 :(得分:0)

您的编号基于footnote元素,其中只有3个。当您尝试为section元素中的chapterjournal编号时,如果您更改模板以匹配journal元素,然后在此

中选择chaptersection元素,则可能会更好
<xsl:template match="journal">
   <xsl:for-each select="section|chapter">

然后,要获取序列号,请计算任意级别sectionchapter元素的数量

 <xsl:attribute name="id">
     <xsl:number format="001" count="section|chapter" level="any"/>
 </xsl:attribute>

试试这个XSLT

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0">
    <xsl:strip-space elements="*" />
    <xsl:output method="xml" indent="yes" />

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

    <xsl:template match="journal">
        <xsl:for-each select="section|chapter">
            <journalcontent>
                <xsl:attribute name="id">
                    <xsl:number format="001" count="section|chapter" level="any"/>
                </xsl:attribute>
                 <xsl:copy-of select="."/>
             </journalcontent>
        </xsl:for-each>
    </xsl:template>
</xsl:stylesheet>