使用XSLT将文件夹中的XML文件转换为XML文件

时间:2013-06-17 05:00:20

标签: xml xslt xslt-2.0

经过一些试验和错误解决了我自己的问题。感谢所有人的帮助。

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

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

提前感谢您的帮助。

1 个答案:

答案 0 :(得分:1)

经过一些试验和错误解决了我自己的问题。感谢所有人的帮助。

这里做了重点改变:

<xsl:result-document href="outputDITANEW/{title/text()}.dita" format="mygloss">