0

经过几次试验和错误后解决了我自己的问题。感谢大家的帮助。

我有一个关于如何转换位于本地系统文件夹中的一组 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() 的第一个参数。

希望这将使我的问题更加清晰。

在此先感谢您的帮助。

4

1 回答 1

1

经过几次试验和错误后解决了我自己的问题。感谢大家的帮助。

此处进行了关键更改:

<xsl:result-document href="outputDITANEW/{title/text()}.dita" format="mygloss"> 
于 2013-06-18T17:41:58.860 回答