XSLT:使用 table 中的搜索结果创建新主题

XSLT: create new topic with results of search in table

我想从引用的 glossentry 主题列表中得到一个 table,结果如下:

我从一个 DITAMAP 开始,其中引用了 "glossentry" 个主题。 在这个 glossentry 主题中,我可以找到我想要使用的两个元素 "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>

光泽度 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>

光泽度 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>

我的代码得到的是每 "glossentry" 一行:

到目前为止的结果:

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

最终结果应该是:

预期最终结果示例:

<?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 还是个新手。欢迎任何帮助。

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>

假设对于 map 文档中的每个 topicref,同一目录中都有一个文件,其名称等于 href 属性的值。

如果你更深入地了解 DITA 技术,特别是专业化和关键 defintion/reference,你就会知道不需要特殊的 XSLT 样式表来生成新主题的 table 样式。

你的需求只需要改变DITA map & topic authoring就可以解决

  • 使用从 simpletable 专门化的 glossaryTable
  • 为每个 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 映射

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

词汇表: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 with PDF5-ML

此解决方案使用 glossaryTable 专业化。您可以查看原始专业化代码 in GitHub 由于 glossaryTable 是从 simpletable 专业化而来的,因此 NO 需要样式表自定义。