XSLT: создать новую тему с результатами поиска в таблице - PullRequest
0 голосов
/ 28 марта 2019

Из списка упомянутых тем глоссария я хотел бы получить одну таблицу со следующим результатом:

  • столбец 1: значение элемента glossterm
  • столбец 2: значение элемента glossdef.

Я начинаю с одного DITAMAP со ссылками на темы "глоссентри". В этой теме я могу найти два элемента, которые я хочу использовать: «glossterm» и «glossdef».

DITAMAP

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE map PUBLIC "-//OASIS//DTD DITA Map//EN" "map.dtd">
<map>
<title>Glossary</title>
<topicref href="gloss_ar3.dita" keys="ar3"/>
<topicref href="gloss_chr.dita" keys="chr"/>
</map>

Glossentry 1 (gloss_ar3.dita):

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE glossentry PUBLIC "-//OASIS//DTD DITA Glossary//EN" "glossary.dtd">
<glossentry id="glossentry_vhg_gt4_m2b">
<glossterm><sort-as value="AR3"/>AR3</glossterm>
<glossdef>Amplification Reagent 3</glossdef>
</glossentry>

Glossentry 2 (gloss_chr.dita):

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE glossentry PUBLIC "-//OASIS//DTD DITA Glossary//EN" "glossary.dtd">
<glossentry id="glossentry_v1f_ktv_j2b">
<glossterm><sort-as value="Chr"/>Chr</glossterm>
<glossdef>Chromosome</glossdef>
</glossentry>

То, что я получаю с моим кодом, - это строка за «глоссентри» с:

  • glossterm в первом столбце
  • glossdef во втором столбце.

Результат на данный момент:

<row>
   <entry>AR3</entry>
   <entry>Amplification Reagent 3</entry>
</row>
<row>
   <entry>Chr</entry>
   <entry>Chromosome</entry>
</row>

Пока все хорошо.

Но я бы хотел:

  • иметь строки в обычной таблице
  • сохранить в новом файле

Пока это мой XSLT:

<?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"
   exclude-result-prefixes="xs"
   version="2.0">

<xsl:output indent="yes" />

<xsl:template match="/map">
<xsl:apply-templates select="topicref"/>
</xsl:template>
<xsl:template name="rows" match="topicref">
   <xsl:for-each select="document(@href)/glossentry">
      <row>     
      <entry><xsl:apply-templates select="glossterm"/></entry>
      <entry><xsl:apply-templates select="glossdef"/></entry>
      </row>
      </xsl:for-each>
</xsl:template>    
</xsl:stylesheet>

Конечный результат должен быть:

  • таблица со всеми терминами и определениями в отдельных строках.
  • сохранено в отдельном файле в той же папке, что и ditamap.

Пример ожидаемого конечного результата:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE topic PUBLIC "-//OASIS//DTD DITA Topic//EN" "topic.dtd">
<topic id="topic_ph2_kqz_fhb">
    <title>Glossary</title>
    <body>
        <p>
<table id="table_rzs_kqz_fhb">
<title/>
<tgroup cols="2">
<colspec colname="c1" colnum="1"/>
<colspec colname="c2" colnum="2"/>
<thead>
<row>
<entry>Term</entry>
<entry>Description</entry>
</row>
</thead>
<tbody>
<row>
<entry>AR3</entry>
<entry>Amplification Reagent 3</entry>
</row>
<row>
<entry>Chr</entry>
<entry>Chromosome</entry>
</row>
</tbody>
</tgroup>
</table>
</p>
    </body>
</topic>

Я все еще новичок в XSLT. Любая помощь будет приветствоваться.

Ответы [ 2 ]

0 голосов
/ 30 марта 2019

Если вы глубже узнаете о технологии DITA, особенно о специализации и определении / справочнике ключей, вы поймете, что для создания новых тем для стилевого оформления таблицы не требуется специальной таблицы стилей XSLT.

Ваше требование может бытьрешено только изменение карты DITA и создание темы.

  • Использовать glossaryTable, который специализируется с simpletable.
  • Определить ключи для каждого glossentry

Вот пример разработки:

Основная карта DITA

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE map PUBLIC "-//OASIS//DTD DITA Map//EN" "map.dtd">
<map>
    <title>Glossary Table Test</title>
    <mapref href="mKeydefMap.ditamap"/>
    <topicref href="GlossaryTableTest.dita"/>
</map>

Определение ключа DITA map

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE map PUBLIC "-//OASIS//DTD DITA Map//EN" "map.dtd">
<map>
    <title>Keydef Map</title>
    <keydef keys="AR3" href="gloss_ar3.dita"/>
    <keydef keys="CHR" href="gloss_chr.dita"/>
</map>

Glossenries: gloss_chr.dita и gloss_ar3.dita

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE glossentry PUBLIC "-//OASIS//DTD DITA Glossary//EN" "glossary.dtd">
<glossentry id="glossentry_v1f_ktv_j2b">
    <glossterm id="term"><sort-as value="Chr"/>Chr</glossterm>
    <glossdef id="def">Chromosome</glossdef>
</glossentry>

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE glossentry PUBLIC "-//OASIS//DTD DITA Glossary//EN" "glossary.dtd">
<glossentry id="glossentry_vhg_gt4_m2b">
    <glossterm id="term"><sort-as value="AR3"/>AR3</glossterm>
    <glossdef id="def">Amplification Reagent 3</glossdef>
</glossentry>

GlossaryTableTest.dita

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE concept PUBLIC "-//ANTENNA HOUSE//DTD DITA Concept//EN" "concept.dtd">
<concept id="GlossaryTableTest">
    <title>Glossary Table Test</title>
    <conbody>
        <p>Glossary Table</p>
        <glossaryTable>
            <gtHead>
                <gtEntryHd>Term</gtEntryHd>
                <gtEntryHd>Definition</gtEntryHd>
            </gtHead>
            <gtRow>
                <gtEntry><glossterm conkeyref="AR3/term"/></gtEntry>
                <gtEntry><glossdef conkeyref="AR3/def"/></gtEntry>
            </gtRow>
            <gtRow>
                <gtEntry><glossterm conkeyref="CHR/term"></glossterm></gtEntry>
                <gtEntry><glossdef conkeyref="CHR/def"></glossdef></gtEntry>
            </gtRow>
        </glossaryTable>
    </conbody>
</concept>

Результат форматирования с использованием DITA-OT 3.3 с PDF5-ML Formatting Result Using AH Formatter

В этом решении используется специализация glossaryTable.Вы можете увидеть оригинальный код специализации в GitHub Так как glossaryTable специализируется с simpletable, для настройки таблицы стилей NO необходимы.

0 голосов
/ 28 марта 2019

AFAICT, вы хотите сделать что-то вроде:

XSLT 1.0

<xsl:template match="/map">
    <table>
        <xsl:for-each select="topicref">
            <xsl:variable name="gloss" select="document(@href)/glossentry" />
             <row>     
                <entry>
                    <xsl:value-of select="$gloss/glossterm"/>
                </entry>
                <entry>
                    <xsl:value-of select="$gloss/glossdef"/>
                </entry>
            </row>
        </xsl:for-each>
    </table>
</xsl:template>

</xsl:stylesheet>

Это предполагает, что для каждого topicref в документе map в том же каталоге есть файл, имя которого равно значению атрибута href.

...