尝试从原始XML复制元素“ ID”及其值。然后将该“ ID”及其值插入Subheader2下的新XML。
当前已成功为Subheader2的每个子标题在Subheader2下创建了新元素。但是,“ ID”返回空,仅显示关联的名称空间。
还尝试了此操作,其中Header / ID是自己应用的模板。但这仅创建了“ ID”。但是,该“ ID”具有正确的值。
XML输入
<Header xmlns="urn:stuff:xml:ns:neo">
<Date>2019-03-07T14:38:00</Date>
<ID>1</ID>
<Comment/>
<Subheader1>
<Subheader2>
<Item>A11</Item>
<Quantity>2</Quantity>
<Location>R12</Location>
</Subheader2>
<Subheader2>
<Item>A12</Item>
<Quantity>5</Quantity>
<Location>R10</Location>
</Subheader2>
</Subheader1>
</Header>
XSLT
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:neo="xmlns="urn:stuff:xml:ns:neo">
<xsl:output method="xml" omit-xml-declaration="yes" indent="yes"/>
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="neo:Subheader2">
<xsl:copy>
<ID>
<xsl:value-of select="@neo:Header/neo:ID"/>
</ID>
<xsl:copy-of select="@*|node()"/>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
XML输出
<Header xmlns="urn:stuff:xml:ns:neo">
<Date>2019-03-07T14:38:00</Date>
<ID>1</ID>
<Comment/>
<Subheader1>
<Subheader2>
<ID>1</ID>
<Item>A11</Item>
<Quantity>2</Quantity>
<Location>R12</Location>
</Subheader2>
<Subheader2>
<ID>1</ID>
<Item>A12</Item>
<Quantity>5</Quantity>
<Location>R10</Location>
</Subheader2>
</Subheader1>
</Header>
所需的XML输出
<Subheader1>
<Subheader2>
<ID>1</ID>
<Item>A11</Item>
<Quantity>2</Quantity>
<Location>R12</Location>
</Subheader2>
<Subheader2>
<ID>1</ID>
<Item>A12</Item>
<Quantity>5</Quantity>
<Location>R10</Location>
</Subheader2>
</Subheader1>
当前XML输出
<Header xmlns="urn:stuff:xml:ns:neo">
<Date>2019-03-07T14:38:00</Date>
<ID>1</ID>
<Comment/>
<Subheader1>
<Subheader2>
<ID xmlns="" xmlns:neo="urn:stuff:xml:ns:neo"/>
<Item>A11</Item>
<Quantity>2</Quantity>
<Location>R12</Location>
</Subheader2>
<Subheader2>
<ID xmlns="" xmlns:neo="urn:stuff:xml:ns:neo"/>
<Item>A12</Item>
<Quantity>5</Quantity>
<Location>R10</Location>
</Subheader2>
</Subheader1>
</Header>
基本上,我只是将'ID'元素复制到'Subheader2'之后。真的,我只希望每个Subheader2的Subheader1 / Subheader2中的数据都可以,但是只需将“ ID”添加到每个“ Subheader2”中就可以了。
答案 0 :(得分:0)
使用xsl:for-each仅定位Subheader2数据。
发现您创建了XML变量。在for-each外部创建一个变量,然后将其用作Subheader2的xsl扩展范围内的值。
XSL
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns="urn:stuff:xml:ns:neo">
<xsl:output method="xml" omit-xml-declaration="yes" indent="yes"/>
<xsl:template match="/">
<xsl:variable name="variable" select="neo:Header/neo:ID"/>
<xsl:for-each select="neo:Header/neo:Subheader1/neo:Subheader2">
<Subheader2>
<ID><xsl:value-of select="$variable"/></ID>
<Item><xsl:value-of select="neo:Item"/></Item>
<Quantity><xsl:value-of select="neo:Quantity"/></Quantity>
<Location><xsl:value-of select="neo:Location"/></Location>
</Subheader2>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>
这将创建以下XML
<Subheader2 xmlns:neo="urn:stuff:xml:ns:neo">
<ID>1</ID>
<Item>A11</Item>
<Quantity>2</Quantity>
<Location>R12</Location>
</Subheader2>
<Subheader2>
<ID>1</ID>
<Item>A12</Item>
<Quantity>5</Quantity>
<Location>R10</Location>
</Subheader2>
答案 1 :(得分:0)
根据迈克尔·凯(Michael Kay)在另一个答案中的评论,您也可以这样做。...
<xsl:value-of select="/neo:Header/neo:ID"/>
(因此,您只有一个字符。@
代表一个属性,/
代表顶级文档节点)。
您还需要添加一个模板,以忽略其当前位置的neo:ID
<xsl:template match="neo:ID" />
但是您还有另一个问题。在模板中执行<ID>...</ID>
会在没有名称空间的情况下创建一个ID
元素,这就是为什么在输出中获得xmlns=""
的原因。您需要做的是在XSLT中声明一个默认名称空间,以便在该名称空间中创建ID
元素。
xmlns="urn:stuff:xml:ns:neo"
尝试使用此XSLT:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:neo="urn:stuff:xml:ns:neo"
xmlns="urn:stuff:xml:ns:neo"
exclude-result-prefixes="neo">
<xsl:output method="xml" omit-xml-declaration="yes" indent="yes"/>
<xsl:strip-space elements="*" />
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="neo:ID" />
<xsl:template match="neo:Subheader2">
<xsl:copy>
<ID>
<xsl:value-of select="/neo:Header/neo:ID"/>
</ID>
<xsl:copy-of select="@*|node()"/>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
请注意,如果您不想在输出中使用neo:Header
元素(或除SubHeader2
之外的子节点,则将与此匹配的模板neo:ID
替换为:>
<xsl:template match="/*">
<xsl:apply-templates select="neo:Subheader1/neo:Subheader2" />
</xsl:template>