这里有一个XSLT新手。我有一个可以看起来像任何东西的XML块,但是根据其元素名称,我需要能够更改其内容。问题是XML可以加上前缀。
带前缀的XML可能如下所示:
<POIS xmlns:tns="http://example.com/integration/docs"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<tns:POI>
<tns:CTL>
<tns:transaction_date/>
<tns:record_qualifier/>
<tns:start_date>2012-10-12 </tns:start_date>
<tns:test_indicator>P</tns:test_indicator>
</tns:CTL>
</tns:POI>
</tns:POIS>
或者没有前缀:
<POIS xmlns="http://example.com/integration/docs"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<POI>
<CTL>
<transaction_date/>
<record_qualifier/>
<start_date>2012-10-12</start_date>
<test_indicator>P</test_indicator>
</CTL>
</POI>
</POIS>
当有值时,我想更改以 _date 结尾的元素的内容。
所以可能的输出是:
<POIS xmlns:tns="http://example.com/integration/docs"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<tns:POI>
<tns:CTL>
<tns:transaction_date/>
<tns:record_qualifier/>
<tns:start_date>20121012 </tns:start_date>
<tns:test_indicator>P</tns:test_indicator>
</tns:CTL>
</tns:POI>
</tns:POIS>
这是我到目前为止所做的:
问题在于,当为前缀添加时,它会对更改的元素上的 tns:namespace 抱怨,或者为非前缀的XML元素添加空白的命名空间。
任何解决方案?这是一个实用程序转换,所以我希望尽可能保持通用。
<xsl:stylesheet version="2.0"
xmlns:xp20="http://www.oracle.com/XSL/Transform/
java/oracle.tip.pc.services.functions.Xpath20"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="node()|@*">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="node()[ends-with(name(), '_date')]">
<xsl:choose>
<xsl:when test="(text())" >
<xsl:element name="{name()}" >
<xsl:value-of select ="xp20:format-dateTime(text(),'[Y0001][M01][D01]')" />
</xsl:element>
</xsl:when>
<xsl:otherwise>
<xsl:copy>
<xsl:apply-templates select="node()|@*"/>
</xsl:copy>
</xsl:otherwise>
</xsl:choose>
</xsl:template>
</xsl:stylesheet>
答案 0 :(得分:1)
尝试将<xsl:element name="{name()}">
更改为<xsl:element name="{local-name()}">
。