XSLT:使用 table 中的搜索结果创建新主题
XSLT: create new topic with results of search in table
我想从引用的 glossentry 主题列表中得到一个 table,结果如下:
- 第 1 列:glossterm 元素的值
- 第 2 列:glossdef 元素的值。
我从一个 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" 一行:
- glossterm 在第一列
- 第二列中的 glossdef。
到目前为止的结果:
<row>
<entry>AR3</entry>
<entry>Amplification Reagent 3</entry>
</row>
<row>
<entry>Chr</entry>
<entry>Chromosome</entry>
</row>
到目前为止一切顺利。
但我想:
- 有规则的行table
- 将其保存到新文件中
到目前为止,这是我的 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>
最终结果应该是:
- a table 所有术语和定义在单独的行中。
- 保存在与 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 还是个新手。欢迎任何帮助。
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 需要样式表自定义。
我想从引用的 glossentry 主题列表中得到一个 table,结果如下:
- 第 1 列:glossterm 元素的值
- 第 2 列:glossdef 元素的值。
我从一个 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" 一行:
- glossterm 在第一列
- 第二列中的 glossdef。
到目前为止的结果:
<row>
<entry>AR3</entry>
<entry>Amplification Reagent 3</entry>
</row>
<row>
<entry>Chr</entry>
<entry>Chromosome</entry>
</row>
到目前为止一切顺利。
但我想:
- 有规则的行table
- 将其保存到新文件中
到目前为止,这是我的 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>
最终结果应该是:
- a table 所有术语和定义在单独的行中。
- 保存在与 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 还是个新手。欢迎任何帮助。
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 需要样式表自定义。