我的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>
我想知道如何选择期望的内容。
答案 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的充分理由,但您可能不需要这样做,而您正试图通过这样做来增加复杂性。