默认情况下打印XSLT 1.0文本节点

Pet*_*ter 6 xslt pattern-matching

我看过XSL xsl:template match ="/"但是没有提到触发我问题的匹配模式.

我有一个相当复杂的XML结构:

<?xml version="1.0" encoding="UTF-8"?>
<MATERIAL_DATA>
<LOG>
    <USER>Peter</USER>
    <DATE>2011-02-18</DATE>
    <MATERIALS>
        <item>
            <MATNR>636207</MATNR>
            <TEXTS>
                <item>
                    <TEXT>granola bar 40gx24</TEXT>
                </item>
            </TEXTS>
            <PRICES>
                <item>
                    <MATNR>636207</MATNR>
                    <COST>125.78</COST>
                </item>
            </PRICES>
            <SALESPRICES>
                <item>
                    <B01>
                        <MATNR>636207</MATNR>
                        <CURR>CZK</CURR>
                        <DATBI>9999-12-31</DATBI>
                        <DATAB>2010-10-05</DATAB>
                    </B01>
                    <B02>
                        <item>
                            <PRICE>477.60</PRICE>
                            <KUNNR>234567</KUNNR>
                        </item>
                    </B02>
                </item>
            </SALESPRICES>
        </item>
    </MATERIALS>
</LOG>
</MATERIAL_DATA>
Run Code Online (Sandbox Code Playgroud)

现在,如果我应用以下XSLT,我的输出看起来正确:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:output method="xml" indent="yes" encoding="UTF-8"/>

<xsl:template match="node() | @*">
    <xsl:apply-templates select="* | @*" />
</xsl:template>

<xsl:template match="B02">
    <xsl:element name="Mi">
        <xsl:value-of select="item/KUNNR"/>
    </xsl:element>
</xsl:template>

</xsl:stylesheet>
Run Code Online (Sandbox Code Playgroud)

我得到输出:

<?xml version="1.0" encoding="UTF-8"?>
<Mi>234567</Mi>
Run Code Online (Sandbox Code Playgroud)

但是,如果我应用XSLT:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">

<xsl:output method="xml" indent="yes" encoding="UTF-8"/>

<xsl:template match="/*">
    <xsl:element name="MenuItems">
        <xsl:apply-templates select="LOG/MATERIALS/item/SALESPRICES/item"/>
    </xsl:element>
 </xsl:template>

<xsl:template match="B02">
    <xsl:element name="Mi">
        <xsl:value-of select="item/KUNNR"/>
    </xsl:element>
</xsl:template>

</xsl:stylesheet>
Run Code Online (Sandbox Code Playgroud)

输出看起来像这样:

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

                        636207
                        CZK
                        9999-12-31
                        2010-10-05
<Mi>234567</Mi>
</MenuItems>
Run Code Online (Sandbox Code Playgroud)

元素<B01>中的所有值都在输出中!但为什么 - 我不匹配<B01>!?如何

<xsl:template match="node() | @*">
<xsl:apply-templates select="* | @*" />
</xsl:template>
Run Code Online (Sandbox Code Playgroud)

使输出正确输出?我所做的就是将所有节点或属性与apply-templates匹配到所有或所有属性.但在我看来,当我完全匹配时,它不应该有所作为<B01>!有没有人知道为什么会这样?

感谢您的理解和提示!

最好的问候,彼得

Way*_*ett 15

XSLT包括以下默认模板(以及其他模板):

<!-- applies to both element nodes and the root node -->
<xsl:template match="*|/">
  <xsl:apply-templates/>
</xsl:template>

<!-- copies values of text and attribute nodes through -->
<xsl:template match="text()|@*">
  <xsl:value-of select="."/>
</xsl:template>
Run Code Online (Sandbox Code Playgroud)

在第一个样式表中,您隐式匹配所有文本节点node(),从而覆盖默认操作.然后,在B2模板中输出目标值并不再应用其他模板,这将停止处理.

在第二个样式表中,您明确将模板应用于所有子项LOG/MATERIALS/item/SALESPRICES/item,从而使默认模板处理您未明确处理的节点.由于您在B2不向其子项应用模板的情况下显式处理,因此永远不会为这些节点调用默认模板.但是默认的模板应用到的孩子B1.

将以下模板添加到第二个样式表将覆盖文本节点的默认操作:

<xsl:template match="text()|@*"></xsl:template>
Run Code Online (Sandbox Code Playgroud)

结果如下:

<?xml version="1.0" encoding="UTF-8"?>
<MenuItems><Mi>234567</Mi></MenuItems>
Run Code Online (Sandbox Code Playgroud)

更多: