XSLT用生成的标签替换标签

时间:2011-12-02 12:28:26

标签: xslt

我对XSLT很新。

这是我现在想要解决几个小时的问题:

我为xml文档自动生成一个目录,该文档到目前为止效果很好。但是,我想用我刚生成的toc代码替换源xml中的占位符标记。 因此输出应该包含整个文档,替换的placeholder-toc-tag和自动生成的toc xml。

这是我尝试过的:

假设我在文档中的任何位置都有占位符标签,并希望替换这些/那些。我以为我可以通过node()循环遍历所有节点,并检查节点名称是否等于我的占位符标记:

<xsl:template match="node()">
    <xsl:choose>
        <xsl:when test="divGen">
            <!-- apply other template to generate toc-->
        </xsl:when>
        <xsl:otherwise>
            <xsl:copy-of select="node()"/>
        </xsl:otherwise>
    </xsl:choose>
</xsl:template>

但if语句不会像这样匹配。

编辑: 好的,这是源文档(TEI编码 - 删除了TEI名称空间):

<TEI>
<teiHeader>
    <fileDesc>
        <titleStmt>
            <title>Title</title>
        </titleStmt>
        <publicationStmt>
            <p>Publication information</p>
        </publicationStmt>
        <sourceDesc>
            <p>Information about the source</p>
        </sourceDesc>
    </fileDesc>
</teiHeader>
<text>
    <front>
        <titlePage>
            <byline>title page details</byline>
        </titlePage>
    </front>

    <body>
        <divGen type="toc"/>

        <div type="part">
            <div type="section">
                <head>heading1</head>
            </div>
            <div type="section">
                <head>heading2</head>
            </div>
        </div>
        <div type="part">
            <div type="section">
                <head>heading3</head>
            </div>
            <div type="section">
                <head>heading4</head>
            </div>
            <div type="section">
                <head>heading5</head>
            </div>
        </div>
    </body>

    <back> </back>
</text>

我想从头部值自动生成toc,并用自动生成的toc代码替换divGen标签。但请注意,divGen标签可以位于文档中的任何位置,但不能位于正文之外。

有什么想法吗?

克里斯

2 个答案:

答案 0 :(得分:2)

好问题,+ 1。

这是一个完整的转换(模拟TOC生成被真实替换),显示如何执行此操作

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

 <xsl:variable name="vTOC">
  <xsl:apply-templates mode="TOC"/>
  <mockTOC>
    <xsl:comment>The real TOC generated here</xsl:comment>
  </mockTOC>
 </xsl:variable>

 <xsl:template match="node()|@*">
     <xsl:copy>
       <xsl:apply-templates select="node()|@*"/>
     </xsl:copy>
 </xsl:template>

 <xsl:template match="divGen[@type='toc']">
  <xsl:copy-of select="$vTOC"/>
 </xsl:template>

 <xsl:template match="text()" mode="TOC"/>
</xsl:stylesheet>

将此转换应用于提供的XML文档

<TEI>
    <teiHeader>
        <fileDesc>
            <titleStmt>
                <title>Title</title>
            </titleStmt>
            <publicationStmt>
                <p>Publication information</p>
            </publicationStmt>
            <sourceDesc>
                <p>Information about the source</p>
            </sourceDesc>
        </fileDesc>
    </teiHeader>
    <text>
        <front>
            <titlePage>
                <byline>title page details</byline>
            </titlePage>
        </front>
        <body>
            <divGen type="toc"/>
            <div type="part">
                <div type="section">
                    <head>heading1</head>
                </div>
                <div type="section">
                    <head>heading2</head>
                </div>
            </div>
            <div type="part">
                <div type="section">
                    <head>heading3</head>
                </div>
                <div type="section">
                    <head>heading4</head>
                </div>
                <div type="section">
                    <head>heading5</head>
                </div>
            </div>
        </body>
        <back>
        </back>
    </text>
</TEI>

生成正确的,需要的输出,其中<divGen type="toc"/>的任何出现都被生成的TOC替换

<TEI>
   <teiHeader>
      <fileDesc>
         <titleStmt>
            <title>Title</title>
         </titleStmt>
         <publicationStmt>
            <p>Publication information</p>
         </publicationStmt>
         <sourceDesc>
            <p>Information about the source</p>
         </sourceDesc>
      </fileDesc>
   </teiHeader>
   <text>
      <front>
         <titlePage>
            <byline>title page details</byline>
         </titlePage>
      </front>
      <body>
         <mockTOC><!--The real TOC generated here--></mockTOC>
         <div type="part">
            <div type="section">
               <head>heading1</head>
            </div>
            <div type="section">
               <head>heading2</head>
            </div>
         </div>
         <div type="part">
            <div type="section">
               <head>heading3</head>
            </div>
            <div type="section">
               <head>heading4</head>
            </div>
            <div type="section">
               <head>heading5</head>
            </div>
         </div>
      </body>
      <back/>
   </text>
</TEI>

解释:使用 modes 在变量中预先生成TOC,然后覆盖 identity rule 对于任何TOC占位符。

答案 1 :(得分:0)

Im guessing somewhere u have a template like

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

然后你希望模板只匹配你的占位符标签

然后其他人将默认为您的其他节点!

<xsl:template match="placeholderTag">
    <!-- applying generate toc thing-->
</xsl:template>

<xsl:template match="node()">
    <xsl:copy-of select="node()"/>    
</xsl:template>