我有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>