0

我有一个如下的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,一种新的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>`

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

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

这是我的aimlTest.xsl:</p>

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

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

4

1 回答 1

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 理由,但您可能不需要这样做,而且您尝试这样做会增加复杂性。

于 2018-12-11T20:42:38.307 回答