我今天的挑战是找出如何复制源文档的Doctype。 好的,首先,这是我的来源:
<?xml version='1.0' encoding='ISO-8859-1'?>
<!DOCTYPE XMLBlock SYSTEM "/dtd/XMLBlock.dtd" [
<!ENTITY change '<issue>
<version>VERSION NO: 98765432</version>
<purpose><![CDATA[
Main purpose
- to do things
- to fix issues ]]>
</purpose>
</issue> '>]>
<XMLBlock>
<Title>XML Stuff</Title>
<Content>DemoText</Content>
</XMLBlock>
正如您所看到的,内部实体的版本号为每次都会更改。现在我想抓住这个数字来决定需要哪个包装器。 所以这是我的xslt:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:output doctype-system="/dtd/XMLBlock.dtd" />
<xsl:template match ="/" >
<xsl:choose>
<xsl:when test="&change;/issue/version < 9000000">
<XMLBlock>
<red>
<xsl:copy-of select="*" />
</red>
</XMLBlock>
</xsl:when>
<xsl:otherwise>
<XMLBlock>
<green>
<xsl:copy-of select="*" />
</green>
</XMLBlock>
</xsl:otherwise>
</xsl:choose>
</xsl:template>
</xsl:stylesheet>
但是这个&amp;改变;没有解决,因为它不是xslt的一部分。 那么我该如何解决这个问题,还是只是不可能? 亲切的问候
马库斯
答案 0 :(得分:0)
XSLT没有实体&changed;
的声明,因此它不是有效的XML,正如您所知道的那样。样式表本身是固定的,变量部分只是转换后的文档。
变换器看到的解析XML也没有关于版本值的任何信息。因此将它声明为实体似乎毫无用处。
似乎您的版本号最好存储在处理指令中:
<?xml version="1.0"?>
<!DOCTYPE XMLBlock SYSTEM "/dtd/XMLBlock.dtd"]>
<?version 98765432?>
<XMLBlock> ...
在样式表中,可以轻松访问该版本:
<xsl:variable name="version" select="/processing-instruction('version')"/>