XSLT заменить тег на сгенерированный - PullRequest
3 голосов
/ 02 декабря 2011

Я совершенно новичок в XSLT.

Это проблема, которую я пытаюсь решить часами:

Я автоматически генерирую оглавление для XML-документа, который до сих пор прекрасно работал. Однако я хотел бы заменить тег-заполнитель в моем исходном XML-коде только что сгенерированным ток-кодом. Таким образом, вывод должен включать в себя весь документ с замененным тегом placeholder-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 удалено):

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

Я бы хотел автоматически сгенерировать ток из значений заголовка и заменить тег divGen автоматически созданным кодом токена. Однако обратите внимание, что тег divGen может находиться в любом месте документа, но не снаружи тела.

Есть идеи?

Chris

Ответы [ 2 ]

2 голосов
/ 02 декабря 2011

Хороший вопрос, + 1.

Вот полное преобразование (с заменой фиктивного генерации оглавления на реальное), которое показывает, как это сделать :

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

Объяснение : Использование режимов для предварительного генерирования TOC в переменной, затем переопределяя правило идентификации для любого заполнителя TOC.

0 голосов
/ 02 декабря 2011
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>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...