经过一些试验和错误解决了我自己的问题。感谢所有人的帮助。
我有一个关于如何转换位于本地系统上的文件夹中的一组XML文件的问题。我需要将文件转换为XML,同时保留原始名称,这些名称基于主题text()。
我目前能够使用xslt转换文件并获得所需的结果,但由于我有大量文件,因此一次转换一个文件是不切实际的。
我的输入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()的第一个参数。
希望这会使我的问题更清晰。
提前感谢您的帮助。
答案 0 :(得分:1)
经过一些试验和错误解决了我自己的问题。感谢所有人的帮助。
这里做了重点改变:
<xsl:result-document href="outputDITANEW/{title/text()}.dita" format="mygloss">