小编Pet*_*ter的帖子

区别:child :: node()和child ::*

我刚刚写了一个起初不起作用的XSLT.

我不得不重新命名的所有儿童<Recordset><C>:

<?xml version="1.0" encoding="utf-8"?>
<Record>
<Recordset>
    <company>102</company>
    <store>1801</store>
    ....
</Recordset>
<Recordset>
....
</Recordset>
</Record>
Run Code Online (Sandbox Code Playgroud)

我使用了以下XSLT:

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

它的工作原理和重命名的所有孩子<Recordset><C>.但首先我在模板中的匹配看起来像这样:

<xsl:template match="Record/Recordset/child::node()">
Run Code Online (Sandbox Code Playgroud)

我的想法是每个孩子<Recordset>都是一个节点,因此node()是合适的.它也有效,但它<C/>为每个孩子插入了额外的东西.

child::node()和之间有什么区别child::*

xslt

22
推荐指数
2
解决办法
4万
查看次数

条件AND OR两个不同的值

我有两个不同变量的AND和OR串联.我尝试了以下方法:

<xsl:if test="$countryCode = '104'
               and 
              (transactionType != 'Allowance'
                or 
               revenueCenter != '1100')">
Run Code Online (Sandbox Code Playgroud)

但这不起作用.是否可以进行条件测试,或者我必须将其拆分为:

<xsl:if test="$countryCode='104'>
Run Code Online (Sandbox Code Playgroud)

在第二个元素我做:

<xsl:if transactionType!='Allowance' or revenueCenter!='1100'>
Run Code Online (Sandbox Code Playgroud)

我在互联网上搜索但没有找到任何暗示.任何人都可以帮我找到解决方案.谢谢你,最诚挚的问候,彼得

xslt conditional conditional-statements

8
推荐指数
1
解决办法
4万
查看次数

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

我看过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)

xslt pattern-matching

6
推荐指数
1
解决办法
6045
查看次数

XSLT 1.0:如何寻找“父”轴

我有一个关于在 XPATH 中调用“父”轴的 XSLT 性能的问题。我可以使用“::*”调用父轴,或者使用“::”和元素名称调用它

parent::*/MVKE/item/VMSTA='Z2'
Run Code Online (Sandbox Code Playgroud)

或者

parent::item/MVKE/item/VMSTA='Z2'
Run Code Online (Sandbox Code Playgroud)

如果我使用“*”或使用节点元素的名称,这对性能有影响吗?两者都有效,但我想知道有什么区别。请有人向我解释一下吗?

非常感谢你的帮助和最好的问候,彼得

xslt xpath parent

3
推荐指数
1
解决办法
8450
查看次数

XSLT:如何检查众多节点是否有应用于所有节点的特定值

我有以下简化的XML源:

<?xml version="1.0" encoding="UTF-8"?>
<MVKE>
<item>
    <MANDT>025</MANDT>
    <MATNR>000000000000000551</MATNR>
    <VMSTA>2</VMSTA>
</item>
<item>
    <MANDT>025</MANDT>
    <MATNR>000000000000000551</MATNR>
    <VMSTA>2</VMSTA>
</item>
<item>
    <MANDT>025</MANDT>
    <MATNR>000000000000000551</MATNR>   
    <VMSTA>2</VMSTA>
</item>
</MVKE>
Run Code Online (Sandbox Code Playgroud)

我需要比较这些<VMSTA>值.如果它们都是"2",那么我在目标XML中的标志值应该说"true"否则为"false".

我想出了这个XSLT:

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

<xsl:template match="/">
    <list>
        <xsl:apply-templates select="MVKE"/>
    </list>
</xsl:template>

<xsl:template match="MVKE">
    <flag>
        <xsl:for-each select="item">
            <xsl:choose>
                <xsl:when
                    test="(preceding-sibling::*[1]/VMSTA or self::*/VMSTA = current()/VMSTA) and (current()/VMSTA='2')">
                    <xsl:value-of select="'true'"/>
                </xsl:when>
                <xsl:otherwise>
                    <xsl:value-of select="'false'"/>
                </xsl:otherwise>
            </xsl:choose>
        </xsl:for-each>
    </flag>
</xsl:template>

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

但输出总是如此

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

因为<xsl:for-each>.我也尝试过按键,<VMSTA>但也给了我3个值 …

xslt grouping xpath

3
推荐指数
1
解决办法
2602
查看次数

检查子节点是否存在并应用模板

我有以下简化的XML结构:

<?xml version="1.0" encoding="UTF-8"?>
<ExportData>
<TransportHeader>
    <Timestamp>2011-01-16 06:00:33</Timestamp>
    <From>
        <Name>DynamicExport</Name>
        <Version>1.</Version>
    </From>
    <MessageId>d7b5c5b69a83</MessageId>
</TransportHeader>
<ExportConfig>
    <DateTimeFormat>yyyy-MM-dd HH:mm:ss</DateTimeFormat>
    <DecimalSymbol>.</DecimalSymbol>
</ExportConfig>
<DataSet> 
    <Tables>
        <Table>
            <RH>...</RH>
            <Rows>
                <R>Data1</R>
                <R>Data2</R>
                <R>Data3</R>
                <R>Data4</R>
                <R>Data5</R>
            </Rows>
        </Table>
    </Tables>
</DataSet>
</ExportData>
Run Code Online (Sandbox Code Playgroud)

我必须检查<R>元素是否存在.如果不<R>存在元素,则必须中止映射,否则需要创建<Line>每个元素<R>.

我提出了迄今为止完美运行的解决方案:

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

<!-- suppress nodes that are not matched -->
<xsl:template match="text() | @*">
    <xsl:apply-templates select="text() | @*"/>
</xsl:template>

<xsl:template match="/">
    <xsl:choose>
        <xsl:when test="not(ExportData/DataSet/Tables/Table/Rows/node())">
            <xsl:message terminate="yes">No line …
Run Code Online (Sandbox Code Playgroud)

xslt

2
推荐指数
1
解决办法
2万
查看次数