Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/xslt/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/unity3d/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
XSLT将标记替换为生成的标记_Xslt - Fatal编程技术网

XSLT将标记替换为生成的标记

XSLT将标记替换为生成的标记,xslt,Xslt,我对XSLT很陌生 这就是我几个小时来一直试图解决的问题: 我为xml文档自动生成了一个目录,到目前为止效果很好。但是,我想用刚刚生成的toc代码替换源xml中的占位符标记。 因此,输出应该包括整个文档,其中替换了占位符toc标记和自动生成的toc xml 这就是我尝试过的: 假设我在文档中的任何位置都有占位符标记,并希望替换这个/那些。我想我可以按node()循环遍历所有节点,并检查节点名是否等于占位符标记: <xsl:template match="node()"> &l

我对XSLT很陌生

这就是我几个小时来一直试图解决的问题:

我为xml文档自动生成了一个目录,到目前为止效果很好。但是,我想用刚刚生成的toc代码替换源xml中的占位符标记。 因此,输出应该包括整个文档,其中替换了占位符toc标记和自动生成的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命名空间):


标题
出版信息

关于来源的信息

标题页详细信息 标题1 标题2 头3 头4 标题5

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

有什么想法吗

克里斯

我猜你在什么地方有这样一个模板
然后您希望模板仅与占位符标记匹配

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

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

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

问得好,+1

下面是一个完整的转换(模拟TOC生成将被真实的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>
<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>
<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>

此处生成的实际TOC
当此转换应用于提供的XML文档时

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

标题
出版信息

关于来源的信息

标题页详细信息 标题1 标题2 头3 头4 标题5
生成所需的正确输出,其中出现的任何
都将替换为生成的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>
<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>
<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>

标题
出版信息

关于来源的信息

标题页详细信息 标题1 标题2 头3 头4 标题5

解释:使用在变量中预生成TOC,然后覆盖任何TOC占位符的

能否提供示例输入XML和所需输出?添加了示例输入,我认为输出对示例并不重要,在任何情况下,标题都应该出现way@Chris:不客气。你还不允许投票,但你可以接受答案(点击旁边的查克标记)。@Treemonkey:这几乎是标准技术。阅读我的博客,了解真正有趣的事情:)