xslt for-east总是只有一个元素



我有XML,其中包含多个元素:

<?xml version="1.0" encoding="UTF-8"?>
<data>
<element>
 <ip>192.168.188.101</ip>
</element>
<element>
 <ip>192.168.188.100</ip>
</element>
</data>

我想进入这个结构:

<SYNCDW>
<CIDWSet>
<CI>
<CINUM>192.168.188.101</CINUM>
</CI>
<CI>
<CINUM>192.168.188.100</CINUM>
</CI>
</CIDWSet>
</SYNCDW>

,但总是处理一个元素,第一个元素,尽管我有EAK。

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xs="http://www.w3.org/2001/XMLSchema" exclude-result-prefixes="xs">
    <xsl:output method="xml" encoding="UTF-8" indent="yes"/>
    <xsl:template match="/">
        <SyncCIDW xmlns="http://www.ibm.com/maximo">
            <xsl:attribute name="xsi:schemaLocation" namespace="http://www.w3.org/2001/XMLSchema-instance">http://www.ibm.com/maximo</xsl:attribute>
            <CIDWSet>
            <xsl:for-each select="*[local-name()='data' and namespace-uri()='']/*[local-name()='element' and namespace-uri()='']">
                    <CI>
                        <CINUM>
                            <xsl:value-of select="string(*[local-name()='data' and namespace-uri()='']/*[local-name()='element' and namespace-uri()='']/*[local-name()='ip' and namespace-uri()=''])"/>
                        </CINUM>
                    </CI>
            </xsl:for-each>
            </CIDWSet>
        </SyncCIDW>
    </xsl:template>
</xsl:stylesheet>

为什么我没有被处理所有其他元素,而只是第一个元素?预先感谢您的帮助

几件事:

  • xsl:for-each内部,上下文切换到您要迭代的元素(在这种情况下为/data/element),因此,要选择ip元素,您的XPATH是从您"站在"的/data/element的相对是ip。您的使用方式将在xsl:for-each内部寻找/data/element/data/element/ip,并且不会在<CINUM>内部产生任何值。
  • 您可以简化Xpath表达式。如果您要解决的元素不绑定到一个名称空间,而不是任何元素上的通用匹配和匹配local-name()namespace-uri()=''的谓词,则只需使用简化的XPATHdata/element
  • 如果您正在创建具有静态已知值的静态属性xsi:schemaLocation,则只需使用SyncCIDW元素内部的文字声明。
  • 如果您使用的是xsl:value-of,它将产生所选节点的字符串值。不需要string()功能。

应用于样式表的更改:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" 
       xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
    <xsl:output method="xml" encoding="UTF-8" indent="yes"/>
    <xsl:template match="/">
        <SyncCIDW xmlns="http://www.ibm.com/maximo" 
                  xsi:schemaLocation="http://www.ibm.com/maximo">
            <CIDWSet>
                <xsl:for-each select="data/element">
                    <CI>
                        <CINUM>
                            <xsl:value-of select="ip"/>
                        </CINUM>
                    </CI>
                </xsl:for-each>
            </CIDWSet>
        </SyncCIDW>
    </xsl:template>
</xsl:stylesheet>

相关内容

  • 没有找到相关文章

最新更新