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