xslt如何为copy-of添加特殊属性

时间:2016-03-19 00:44:59

标签: xml xslt

我有以下XML代码:

<root>
 <Kursstamm>
     <Texteinmischdefinitionen>
         <Texteinmischung Typ="Text" Position="Vorlauftext">Text A</Texteinmischung>
     </Texteinmischdefinitionen>
     <KursstammID>Text B
 </KursstammID>
 <Kursstammtitel>Text C</Kursstammtitel>
 <Kurztext>Text D</Kurztext>
 <Kursgebühr>Price</Kursgebühr>
 <Trainerprosa>Text E</Trainerprosa>
   <Texteinmischdefinitionen>
     <Texteinmischung Typ="Text" Position="Hinweistext">Text F </Texteinmischung>
   </Texteinmischdefinitionen>
 </Kursstamm>
</root>

我喜欢用XSLT处理它:

Text A
Text B
Text C
Text D
Text E
Text F

我遇到文字A和文字F的问题!

我使用这个XSLT:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="text" version="1.0" encoding="UTF-8" indent="no"/>
<xsl:template match="/root/Kursstamm">
<xsl:copy-of select="Texteinmischung[@Typ='Vorlauftext']" />
<xsl:copy-of select="KursstammID"/>
<xsl:copy-of select="Kurztext"/>
<xsl:copy-of select="Kursgebühr"/>
<xsl:copy-of select="Trainerprosa"/>
<xsl:copy-of select="Nachlauf"/>
<xsl:copy-of select="Texteinmischung[@Typ='Hinweistext']" />
</xsl:template>
</xsl:stylesheet>

但它没有找到

<Texteinmischung Typ="Text" Position="Vorlauftext">

<Texteinmischung Typ="Text" Position="Hinweistext">

如何获取带有属性的标签?

感谢您的帮助!

2 个答案:

答案 0 :(得分:1)

对于有问题的副本,请尝试:

<xsl:copy-of select=".//*[@Typ]" />

(因为那时的上下文节点是Kursstamm元素,并且为了获取具有“Typ”属性的Texteinmischung,你需要更深入地了解Kursstamm的后代轴,而不仅仅是获得它的直接子项;因此使用“ .//*“在那种情况下”

“HTH,

答案 1 :(得分:1)

YSharp已经为您解答了您的特定问题,但您可能有兴趣知道还有另一种方法可以利用XSLT的built-in templates rules。如果只需要输出各种文本节点,只需要一个匹配文本节点的模板,在该模板中输出带有换行符的文本。

试试这个XSLT:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="text"/>
    <xsl:strip-space elements="*" />

    <xsl:template match="text()">
        <xsl:value-of select="normalize-space()" />
        <xsl:text>&#10;</xsl:text>
    </xsl:template>
</xsl:stylesheet>

请注意,使用xsl:strip-space忽略仅限空格的节点。

如果您想忽略某些元素,例如Kursgebühr,只需添加一个额外的模板:

<xsl:template match="Kursgebühr" />