如果Doctype或包含的实体不为人所知,如何准确复制Doctype?

时间:2015-09-30 13:09:31

标签: xml xslt xpath entity doctype

我今天的挑战是找出如何复制源文档的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 &lt; 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的一部分。 那么我该如何解决这个问题,还是只是不可能? 亲切的问候

马库斯

1 个答案:

答案 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')"/>