gpt4 book ai didi

xml - 当源文档没有 DOCTYPE 时,如何让 XSLT 工作?

转载 作者:数据小太阳 更新时间:2023-10-29 02:51:55 24 4
gpt4 key购买 nike

我有以下 XML 文档:

<?xml version="1.0"  encoding="UTF-8"?>
<!DOCTYPE ONIXmessage SYSTEM "http://www.editeur.org/onix/2.1/short/onix-iternational.dtd">
<ONIXmessage release="2.1">
<header>
<m174>Some Publisher</m174>
<m182>20090622</m182>
</header>
<product>
<a001>160258186X</a001>
<a002>03</a002>
<productidentifier>
<b221>15</b221>
<b244>9781602581869</b244>
</productidentifier>
<b246>02</b246>
<b012>BB</b012>
<title>
<b202>01</b202>
<b203>The Acts of the Apostles</b203>
<b030>The</b030>
<b031>Acts of the Apostles</b031>
<b029>Four Centuries of Baptist Interpretation</b029>
</title>
</product>
</ONIXmessage>

和以下 xslt:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:fo="http://www.w3.org/1999/XSL/Format">
<xsl:variable name="target"><xsl:choose>
<xsl:when test="/ONIXMessage">short</xsl:when>
<xsl:otherwise>reference</xsl:otherwise>
</xsl:choose></xsl:variable>
<xsl:output method="xml" doctype-system="http://www.editeur.org/onix/2.1/reference/onix-international.dtd"/>
<xsl:template match="*">
<xsl:variable name="target-name">
<xsl:choose>
<xsl:when test="$target='short' and @shortname"><xsl:value-of select="@shortname"/></xsl:when>
<xsl:when test="$target='reference' and @refname"><xsl:value-of select="@refname"/></xsl:when>
<xsl:otherwise><xsl:value-of select="name()"/></xsl:otherwise>
</xsl:choose>
</xsl:variable>
<xsl:element name="{$target-name}">
<xsl:copy-of select="@*[not(name()='refname' or name()='shortname')]"/>
<xsl:apply-templates select="*|text()"/>
</xsl:element>
</xsl:template>
<xsl:template match="text()">
<xsl:copy/>
</xsl:template>
</xsl:stylesheet>

当我应用 XSLT 时,输出是完美的。

如果我从源文档中删除 DOCTYPE,则 xslt 将原样复制到输出,而不会发生任何变化。即使缺少文档类型,我如何让 XSLT 工作?

我正在使用以下命令进行测试

xsltproc stylesheet.xsl input.xml > output.xml

最佳答案

由于您的输入中没有@refname 或@shortname,因此将输入原封不动地复制到输出正是此转换似乎要尝试执行的操作。如果它打算做其他事情,您将需要解释那是什么。您没有向我们展示 DTD,但它可以通过多种方式影响结果;例如,它可能声明了@refname 或@shortname 属性的默认值。如果是这种情况,那么由于样式表的行为取决于这些属性,没有它们就无法工作。

关于xml - 当源文档没有 DOCTYPE 时,如何让 XSLT 工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9460857/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com