我是XSLT的新手,我需要将输入xml更改为输出xml
输入
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<ad:AcceptDataInfo xmlns:ad="http://www.abc.com">
<ad:Product>ABC</ad:SubType>
<ad:AccountNo>123</ad:AccountNo>
<ad:Date>20140429</ad:Date>
<ad:Time>160102</ad:Time>
</ad:AcceptDataInfo>
预期输出
<Documents>
<Document>
<Prop>
<Name>Product</Name>
<Value>ABC</Value>
</Prop>
<Prop>
<Name>AccountNo</Name>
<Value>123</Value>
</Prop>
<Prop>
<Name>Date</Name>
<Value>20140429</Value>
</Prop>
<Prop>
<Name>Time</Name>
<Value>160102</Value>
</Prop>
</Document>
</Documents>
我的xslt(不完整(
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" indent="yes"/>
<xsl:template match="*">
<xsl:element name="{local-name(.)}">
<xsl:apply-templates select="@* | node()"/>
</xsl:element>
</xsl:template>
<xsl:template match="@*">
<xsl:attribute name="{local-name(.)}">
<xsl:value-of select="."/>
</xsl:attribute>
</xsl:template>
<xsl:template match="/">
<Documents>
<Document>
<xsl:copy>
<xsl:apply-templates select="node()|@*"/>
</xsl:copy>
</Document>
</Documents>
</xsl:template>
</xsl:stylesheet>
我已经在网上搜索过了,只能删除名称空间前缀,并添加了一些标签,提前谢谢!
基于单个示例很难确定转换的逻辑。我猜你想要这样的东西:
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:template match="/*">
<Documents>
<Document>
<xsl:apply-templates select="*"/>
</Document>
</Documents>
</xsl:template>
<xsl:template match="*">
<Prop>
<Name><xsl:value-of select="local-name()"/></Name>
<Value><xsl:value-of select="."/></Value>
</Prop>
</xsl:template>
</xsl:stylesheet>
当以上内容应用于的(已校正!(输入时
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<ad:AcceptDataInfo xmlns:ad="http://www.abc.com">
<ad:Product>ABC</ad:Product>
<ad:AccountNo>123</ad:AccountNo>
<ad:Date>20140429</ad:Date>
<ad:Time>160102</ad:Time>
</ad:AcceptDataInfo>
产生以下结果:
<?xml version="1.0" encoding="UTF-8"?>
<Documents>
<Document>
<Prop>
<Name>Product</Name>
<Value>ABC</Value>
</Prop>
<Prop>
<Name>AccountNo</Name>
<Value>123</Value>
</Prop>
<Prop>
<Name>Date</Name>
<Value>20140429</Value>
</Prop>
<Prop>
<Name>Time</Name>
<Value>160102</Value>
</Prop>
</Document>
</Documents>
请注意,这假设实际上事先对源XML一无所知,只是它具有两级结构(根元素和根元素的子元素(。否则,我们可以减少转换的通用性,从而提高效率。
这里有很多问题:
- 样式表不会在任何地方声明
<Prop>, <Name>
或<Value>
元素 - 您使用
value-of
的唯一位置是在属性匹配模板中-要获得任何元素值,您需要在元素匹配模板中执行此操作,或者选择形式为select='element_name/text()'
的节点
如果您在样式表中用期望的内容注释每个元素,以找出您的理解有缺陷的地方,这将是非常有用的。XSLT问题通常可以归结为"您期待什么?"从阅读(错误的(样式表中通常看不出这一点。