经过几次试验和错误后解决了我自己的问题。感谢大家的帮助。
我有一个关于如何转换位于本地系统文件夹中的一组 XML 文件的问题。我需要将文件转换为 XML,同时保留基于主题 text() 的原始名称。
我目前能够使用 xslt 转换 a 文件并获得所需的结果,但是因为我有很多文件,一次转换一个文件是不切实际的。
我的输入 XML 如下所示:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE topic PUBLIC "-//OASIS//DTD DITA Topic//EN" "topic.dtd">
<topic>
<title class="- topic/title ">
Term
</title>
<body class="- topic/body ">
<p class="- topic/p ">Paragraph new</p>
<p class="- topic/p ">(See New parag.)</p>
<p class="- topic/p ">(See Next parag.)</p>
<p class="- topic/p ">(See Test.)</p>
<p class="- topic/p ">(See The other parag)</p>
<p class="- topic/p ">(Refer to the conclusion)</p>
</body>
</topic>
我的 XSLT 如下
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
version="2.0"
xmlns:ditaarch="http://dita.oasis-open.org/architecture/2005/" >
<!-- This adds DOCTYPE declaration -->
<xsl:output method="xml" encoding="UTF-8"
doctype-public="-//OASIS//DTD DITA Glossary//EN"
name="mygloss" doctype-system="glossary.dtd" omit-xml-declaration="no" indent="yes" />
<xsl:output omit-xml-declaration="no" indent="yes"/>
<xsl:param name="files" select="collection('../A/?select=*.dita;recurse=yes')"/>
<xsl:template match="node()|@*">
<xsl:copy copy-namespaces="no">
<xsl:apply-templates select="node()|@*"/>
</xsl:copy>
</xsl:template>
<xsl:template match="/">
<xsl:for-each select="$files//topic">
<!--had issues with this portion, but fixed it by changing from topic/>text() to title/text(). -->
<xsl:result-document href="outputDITANEW/{title/text()}.dita" format="mygloss">
<glossentry id="{concat('test', generate-id())}">
<glossterm id="{concat('test_title', generate-id())}">
<xsl:value-of select="title"/>
</glossterm>
<glossdef>
<xsl:for-each select="body">
<xsl:apply-templates/>
</xsl:for-each>
</glossdef>
</glossentry>
</xsl:result-document>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>
输出 XML 如下所示:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE glossentry
PUBLIC "-//OASIS//DTD DITA Glossary//EN" "glossary.dtd">
<glossentry id="test_d2e11">
<glossterm id="new_term_d2e3">
Term
</glossterm>
<glossdef>
<p>Paragraph new</p>
<p>(See New parag.)</p>
<p>(See Next parag.)</p>
<p>(See Test.)</p>
<p>(See The other parag)</p>
<p>(Refer to the conclusion)</p>
</glossdef>
</glossentry>
我曾尝试使用 xslt collection() 和 result-document(),但我无法使其工作。
上面的 xslt 给了我这个错误:不允许将多个项目的序列作为 concat() 的第一个参数。
希望这将使我的问题更加清晰。
在此先感谢您的帮助。