我遇到的情况是,我有一个完整的xsd文件目录需要转换才能生成每个文件的输出文件。我的样式表在单个文档上运行很好,但我想扩展它。 好吧,现在我还没有使用xslt编辑器,saxon已安装。 这是xslt文件:
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
>
<xsl:output method="text"/>
<!--* Ignore anything that looks complicated *-->
<xsl:template match="xsd:attribute
| xsd:attributeGroup
| xsd:group
| xsd:schema/xsd:element[@type]
| xsd:notation
| xsd:annotation
"/>
<!--* Ignore text nodes (otherwise the output will be
* inundated with whitespace) *-->
<xsl:template match="text()"/>
<!--* Top-level elements with local complex types; those
* we want to handle.
*-->
<xsl:template match = "xsd:schema/xsd:element[xsd:complexType]">
<xsl:apply-templates/>
</xsl:template>
<!--* Aha! A complex type whose content model we want to turn
* into a regular expression
*-->
<xsl:template match = "xsd:element/xsd:complexType
[xsd:sequence | xsd:choice | xsd:all]">
<!--* write out the name for the named regex *-->
<xsl:value-of select="concat('

',
@name, parent::xsd:element/@name,
' ')"/>
<!--* write out the regex *-->
<xsl:apply-templates/>
</xsl:template>
<!--* Simple recursive case: we encounter a model group. *-->
<xsl:template match = "xsd:sequence|xsd:choice|xsd:all">
<!--* Parenthesize the group and handle its children. *-->
<xsl:text>(</xsl:text>
<xsl:apply-templates/>
<xsl:text>)</xsl:text>
<!--* Append *, ?, +, or {min, max}. *-->
<xsl:call-template name="occurrence-indicator"/>
<!--* If our parent has further children,
* append the appropriate connector. *-->
<xsl:call-template name="connector"/>
</xsl:template>
<!--* An element in a content model. *-->
<xsl:template match = "xsd:element[ancestor::xsd:complexType]">
<!--* Write out the element's name. We're lazy so
* we don't bother with a QName for a local element.
* Also, we don't recur. *-->
<xsl:value-of select="concat(@ref, @name)"/>
<!--* Handle occurrence indicator and connect
* just as for groups. *-->
<xsl:call-template name="occurrence-indicator"/>
<xsl:call-template name="connector"/>
</xsl:template>
<!--* Emit the appropriate occurrence indicator for
* a group or element.
* Use {min,max}, {min,}, or {n} notation for
* non-standard occurrence counts.
*-->
<xsl:template name="occurrence-indicator">
<xsl:choose>
<xsl:when test="(@minOccurs='1' or not(@minOccurs))
and
(@maxOccurs='1' or not(@maxOccurs))">
<xsl:text></xsl:text>
</xsl:when>
<xsl:when test="@minOccurs='0'
and
(@maxOccurs='1' or not(@maxOccurs))">
<xsl:text>?</xsl:text>
</xsl:when>
<xsl:when test="@minOccurs='0' and @maxOccurs='unbounded'">
<xsl:text>*</xsl:text>
</xsl:when>
<xsl:when test="(@minOccurs='1' or not(@minOccurs))
and
@maxOccurs='unbounded'">
<xsl:text>+</xsl:text>
</xsl:when>
<xsl:when test="@minOccurs=@maxOccurs">
<xsl:value-of select="concat('{', @minOccurs,'}')"/>
</xsl:when>
<xsl:when test="@maxOccurs='unbounded'">
<xsl:value-of select="concat('{', @minOccurs,',}')"/>
</xsl:when>
<xsl:otherwise>
<xsl:value-of select="concat('{',
@minOccurs,
',',
@maxOccurs,
'}')"/>
</xsl:otherwise>
</xsl:choose>
</xsl:template>
<xsl:template name="connector">
<!--* Emit the appropriate connector, if we need one. *-->
<xsl:if test="following-sibling::*[self::xsd:sequence
| self::xsd:choice
| self::xsd:all
| self::xsd:element]">
<xsl:choose>
<xsl:when test="parent::xsd:sequence">
<xsl:text>, </xsl:text>
</xsl:when>
<xsl:when test="parent::xsd:choice">
<xsl:text> | </xsl:text>
</xsl:when>
<xsl:when test="parent::xsd:all">
<xsl:text> & </xsl:text>
</xsl:when>
</xsl:choose>
</xsl:if>
</xsl:template>
</xsl:stylesheet>
答案 0 :(得分:2)
有很多方法可以进行匹配治疗(bash,vb-scrpt,...)。
我经常使用 ant 。这里有一些示例如何在文件夹中的多个文件上应用XSLT。 ant“build.xml”文件在“destinationFolder”中的所有.xsd文件上运行XSL转换:
<?xml version="1.0" encoding="UTF-8"?>
<project name="TransformMultipleFiles" default="transformMulti">
<property name="xsl_processor.file" value="saxon9he.jar"/>
<target name="transformMulti">
<!-- Transform all the files in the directory -->
<xslt basedir="fileFolder" destdir="destinationFolder" includes="**/*.xsd" extension=".xml" style="yourXSLT.xslt" classpath="${xsl_processor.file}" />
</target>
</project>
只需将上面的代码添加到名为build.xml的文件中,然后只需进入此目录并在控制台中输入“ant”即可使用ant运行该文件。 (当然必须安装ant - 并设置环境变量)。 因为ant是Java,你可以在任何系统上运行它:http://ant.apache.org/
或者您可以使用 collection()函数,但我不确定它是否适用于所有XSLT处理器。看这里的例子: http://www.xmlplease.com/collection
答案 1 :(得分:0)
如果您有权访问bash shell,则可以这样做:导航到包含要处理的文件的目录并键入
for schemadoc in *.xsd
do echo "$schemadoc ..."
xsltproc myxslt.xsl $schemadoc > $schemadoc.output.txt
done
执行此操作时,将myxslt.xsl
更改为您尝试运行的样式表的名称,并更改从xsltproc
开始的行,以匹配从命令行调用XSLT处理器的正确方法。
或者,如果您有权访问Oxygen,您可以阅读如何将样式表应用于给定目录中的所有文件(或所有* .xsd文件),并以此方式执行。
或者,如果您无法访问其中任何一个,请找到在您发现自己的计算环境中成功且愉快地工作的人,并询问他们他们将如何做到这一点。
对文件集合运行进程是一项基本技能,有许多方法可以做到这一点。它什么都没有做与你的XSLT样式表的具体内容并没有根本上说,一个XSLT的问题除非出于某种原因,它必须在单个XSLT过程中完成(在这种情况下,仔细聆听任何Dimitre Novatchev说) 。找到一种,三种或五十五种在您的环境中工作并学习它们的方法。