这是我的XSL转换。
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" indent="yes" omit-xml-declaration="yes" />
<xsl:strip-space elements="*" />
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="EL3">
<te>ABC</te>
</xsl:template>
这是我想要转换的Source-XML。
<EL1 xmlns="http://anyurl.com" language="2">
<EL2>
<set1>
<value1>12</value1>
<value2>34</value2>
<value3>45</value3>
</set1>
</EL2>
<EL2>
<set1>
<value1>AB</value1>
<value2>CD</value2>
<value3>EF</value3>
<EL3>
<value1>AB</value1>
<value2>CD</value2>
<value3>EF</value3>
</EL3>
</set1>
</EL2>
这是转换后的Target-XML。
<EL1 xmlns="http://anyurl.com" language="2">
<EL2>
<set1>
<value1>12</value1>
<value2>34</value2>
<value3>45</value3>
</set1>
</EL2>
<EL2>
<set1>
<value1>AB</value1>
<value2>CD</value2>
<value3>EF</value3>
<EL3>
<value1>AB</value1>
<value2>CD</value2>
<value3>EF</value3>
</EL3>
</set1>
</EL2>
匹配与命名空间无关。如果我从Source-XML中删除xmlns =“http://anyurl.com”,我会得到我想要的结果。问题是我从外部系统获取Source-XML,我之前无法更改Source-XML。我如何为我等待的结果编辑XSL?
<EL1 language="2">
<EL2>
<set1>
<value1>12</value1>
<value2>34</value2>
<value3>45</value3>
</set1>
</EL2>
<EL2>
<set1>
<value1>AB</value1>
<value2>CD</value2>
<value3>EF</value3>
<te>ABC</te>
</set1>
</EL2>
</EL1>
答案 0 :(得分:0)
假设像Saxon 9或XmlPrime这样的XSLT 2.0处理器只需要
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xpath-default-namespace="http://anyurl.com">
<xsl:output method="xml" indent="yes" omit-xml-declaration="yes" />
<xsl:strip-space elements="*" />
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="EL3">
<te>ABC</te>
</xsl:template>
如果您使用XSLT 1.0处理器,则需要
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:df="http://anyurl.com" exclude-result-prefixes="df">
<xsl:output method="xml" indent="yes" omit-xml-declaration="yes" />
<xsl:strip-space elements="*" />
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="df:EL3">
<te>ABC</te>
</xsl:template>
这应该用于匹配,但Carlos解决了另一个问题,即在正确的命名空间中创建新元素,所以你需要
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xpath-default-namespace="http://anyurl.com" xmlns="http://anyurl.com">
<xsl:output method="xml" indent="yes" omit-xml-declaration="yes" />
<xsl:strip-space elements="*" />
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="EL3">
<te>ABC</te>
</xsl:template>
分别
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:df="http://anyurl.com" exclude-result-prefixes="df" xmlns="http://anyurl.com">
<xsl:output method="xml" indent="yes" omit-xml-declaration="yes" />
<xsl:strip-space elements="*" />
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="df:EL3">
<te>ABC</te>
</xsl:template>