XSLT无法将DITA转换为新类型

时间:2018-12-11 04:15:22

标签: xml xslt dita dita-ot

我的xml如下:

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE concept SYSTEM "aimlDomain.dtd">
<?xml-stylesheet type="text/xsl" href="aimlTest.xsl"?>
<concept>
<category>
   <pattern>_ TOPIC ELEMENT ATTRIBUTE</pattern>
   <template><srai>REQUIRED TOPIC AND MAP ELEMENT ATTRIBUTES</srai> 
   </template>
</category> 
<category>
   <pattern>TOPIC ELEMENT ATTRIBUTE _</pattern>
   <template><srai>REQUIRED TOPIC AND MAP ELEMENT ATTRIBUTES</srai> 
   </template>
</category>
</concept>

元素类别是我添加的带有元素专门化的新域,它是从外来元素专门化的。我想将文件转换为新的转换类型aiml。 预期的输出应该像这样:

`   <?xml version="1.0" encoding="utf-8"?>
    <category>
      <pattern>_ TOPIC ELEMENT ATTRIBUTE</pattern>
      <template><srai>REQUIRED TOPIC AND MAP ELEMENT ATTRIBUTES</srai> 
      </template>
    </category>`

但是文件中除了声明以外什么都没有。实际输出如下:

<?xml version="1.0" encoding="UTF-8"?>

这是我的aimlTest.xsl:

  <xsl:stylesheet version="2.0" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:template match="*[contains(@class, ' topic/topic topic/concept ')]">
    <xsl:for-each select="*[contains(@class, ' topic/foreign category-d/category 
    ')]">
    <xsl:copy-of select="."/>
    </xsl:for-each>
    </xsl:template>
    </xsl:stylesheet>

我想知道如何选择期望的内容。

1 个答案:

答案 0 :(得分:0)

有很多无关紧要的因素使事情变得更加复杂。一种是匹配@class属性而不是元素名称。所以我做了一个简化版,见下文。

这是我使用的输入DITA文件(我删除了您的DTD和XSLT PI,因为在此示例中不需要它们):

<?xml version="1.0" encoding="utf-8"?>
<concept>
  <category>
    <pattern>_ TOPIC ELEMENT ATTRIBUTE</pattern>
    <template>
      <srai>REQUIRED TOPIC AND MAP ELEMENT ATTRIBUTES</srai>
    </template>
  </category>
  <category>
    <pattern>TOPIC ELEMENT ATTRIBUTE _</pattern>
    <template>
      <srai>REQUIRED TOPIC AND MAP ELEMENT ATTRIBUTES</srai>
    </template>
  </category>
</concept>

这是我使用的XSLT,仅与元素名称匹配:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="2.0" 
  xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:template match="concept">
    <root>
      <xsl:for-each select="category">
        <xsl:copy-of select="."/>
      </xsl:for-each>
    </root>
  </xsl:template>
</xsl:stylesheet>

我在XSLT中添加了一个根元素(称为<root>,可以是任何名称),因此输出将是正确的XML。

这是输出:

<?xml version="1.0" encoding="UTF-8"?>
<root>
  <category>
    <pattern>_ TOPIC ELEMENT ATTRIBUTE</pattern>
    <template>
      <srai>REQUIRED TOPIC AND MAP ELEMENT ATTRIBUTES</srai>
    </template>
  </category>
  <category>
    <pattern>TOPIC ELEMENT ATTRIBUTE _</pattern>
    <template>
      <srai>REQUIRED TOPIC AND MAP ELEMENT ATTRIBUTES</srai>
    </template>
  </category>
</root>

如果需要,可以将其重构为使用@class属性匹配,但是我怀疑您不需要它。如果确实需要它,请首先确保DTD正确添加了类属性。在DITA DTD中,类属性是“默认”的,这意味着它们将包含在每个XML实例中,即使它们不是字面意义上的XML(有关语法,请参见DITA DTD)。为了发布目的,DITA OT在DITA XML文件上运行初步过程,该过程会在运行XSLT之前提取所有默认的@class属性。然后XML看起来像这样:

<concept class=" topic/concept ">
  <category class=" topic/foreign category-d/category ">
    <pattern class=" etc ">_ TOPIC ELEMENT ATTRIBUTE</pattern>
    <template class=" etc ">
      <srai>REQUIRED TOPIC AND MAP ELEMENT ATTRIBUTES</srai>
    </template>
  </category>
[...]

然后您的原始XSLT可以在类属性上匹配。在这些@class属性上进行匹配有DITA的充分理由,但您可能不需要这样做,而您正试图通过这样做来增加复杂性。