XSLT 无法将 DITA 转换为新类型

XSLT fails to transform DITA into new type

我有一个 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>

元素类别是我添加元素特化的新域,是从国外特化的element.I想把文件转成aiml,一个新的transformtype。 预期的输出应该是这样的:

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

但是除了 declaratinon.The 实际输出如下之外,文件中没有任何内容:

<?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>

我想知道如何select预期的内容。

有很多外部因素使这变得更加复杂。一种是匹配 @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 正确添加了 class 属性。在 DITA DTD 中,class 属性是 "defaulted",这意味着它们包含在每个 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 属性。在这些@class 属性上进行匹配有一个很好的 DITA 理由,但您可能不需要这样做,并且尝试这样做会增加复杂性。