我是XSLT和xml的新手,我需要将输入xml更改为输出xml,假设事先几乎不知道输入和输出XML。
输入
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<ad:AcceptDataInfo xmlns:ad="http://www.abc.com">
<ad:Product>ABC</ad:Product>
<ad:Filename>test.pdf</ad:Filename>
<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>Filename</Name>
<Value>test.pdf</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>
<File>test.pdf</File>
</Document>
</Documents>
xslt文件
<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:template match=
"Value[count(.|((//Value)[2])) = 1]">
<File>
<xsl:apply-templates />
</File>
</xsl:template>
</xsl:stylesheet>
问题是,输出不包括以下行
检验.pdf
从文件名标签复制文件标签的值
任何帮助将不胜感激,谢谢。
答案 0 :(得分:1)
嗯,样式表的问题在于您匹配的Value
不在输入XML中。
您可以尝试以下样式表:
<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="*"/>
<File><xsl:value-of select="child::*[local-name() = 'Filename']"/></File>
</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>