我刚刚写了一个起初不起作用的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::*?
我有两个不同变量的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)
我在互联网上搜索但没有找到任何暗示.任何人都可以帮我找到解决方案.谢谢你,最诚挚的问候,彼得
我看过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) 我有一个关于在 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)
如果我使用“*”或使用节点元素的名称,这对性能有影响吗?两者都有效,但我想知道有什么区别。请有人向我解释一下吗?
非常感谢你的帮助和最好的问候,彼得
我有以下简化的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个值 …
我有以下简化的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)