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

时间:2019-03-28 15:46:14

标签: xslt dita

从参考的词汇表主题列表中,我想得到一张表,其结果如下:

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

我的代码得到的是每个“ glossentry”中的一行:

  • 第一栏中的光泽术语
  • 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 :(得分:0)

如果您深入了解DITA技术,特别是专业化和键定义/引用,您将知道不需要特殊的XSLT样式表即可生成用于表样式的新主题。

仅通过更改DITA地图和主题创作即可解决您的要求。

  • 使用--apilog stdout专业化的glossaryTable
  • 为每个simpletable定义键

这里是创作示例:

DITA主地图

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>

Glossenries:gloss_chr.dita和gloss_ar3.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>

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

使用DITA-OT 3.3PDF5-ML进行格式化的结果 Formatting Result Using AH Formatter

此解决方案使用<?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> 专业化。您可以看到原始的专业代码in GitHub,因为glossaryTableglossaryTable的专业代码,因此样式表定制需要 NO

答案 1 :(得分:-1)

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属性的值。