2012-06-29 40 views
3

我有一个XML文件:XSLT转换

<?xml version="1.0" encoding="utf-8"?> 
<Batch BatchID="896" BatchName="20120629.130504"> 
    <Document DocumentType="XML Question"> 
     <Fields> 
      <Field FieldName="Doc_ID">1</Field> 
      <Field FieldName="Vendor_Code">126400</Field> 
      <Field FieldName="Property_Code">10519</Field> 
      <Field FieldName="Invoice_Num">20509</Field> 
     </Fields><Files /> 
    </Document> 
</Batch> 

,我想将其转换为类似于下面使用XSLT文件:

<?xml version="1.0" standalone="yes"?> 
<ABCRelease> 
    <ABC> 
    <Doc_Id>1345</Doc_Id> 
    <Vendor_Code>134500</Vendor_Code> 
    <Property_Code>105559</Property_Code> 
    <Invoice_Num>2034539</Invoice_Num> 
    </ABC> 
</ABCRelease> 

我第一次与XML和我玩花了好几个小时才没有走到今天,并在这个话题上做了大量的搜索。任何人都可以帮助我,并提供一些示例代码来实现这一点?

我的问题已经在提取字段名值,并从<将其插入>如:

<Field FieldName="Doc_ID">1</Field> 

<Doc_Id>1345</Doc_Id> 

真的会appreaciate你的帮助。

史蒂芬

+0

要小心根据属性值创建元素,如果FieldName属性包含不能用作元素名称的值,例如数值或具有空格的名称,则需要捕获转换这个。假设你完全控制了所使用的值,这不应该导致你的问题,但它肯定是需要注意的事情。 – Flynn1179

回答

1

这种转变

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:output omit-xml-declaration="yes" indent="yes"/> 
<xsl:strip-space elements="*"/> 

<xsl:template match="Fields"> 
    <ABCRelease> 
    <ABC> 
     <xsl:apply-templates/> 
    </ABC> 
    </ABCRelease> 
</xsl:template> 

<xsl:template match="Field"> 
    <xsl:element name="{@FieldName}"> 
    <xsl:value-of select="."/> 
    </xsl:element> 
</xsl:template> 
</xsl:stylesheet> 

时所提供的XML文档应用:

<Batch BatchID="896" BatchName="20120629.130504"> 
    <Document DocumentType="XML Question"> 
     <Fields> 
      <Field FieldName="Doc_ID">1</Field> 
      <Field FieldName="Vendor_Code">126400</Field> 
      <Field FieldName="Property_Code">10519</Field> 
      <Field FieldName="Invoice_Num">20509</Field> 
     </Fields> 
     <Files /> 
    </Document> 
</Batch> 

产生想要的,正确的结果:

<ABCRelease> 
    <ABC> 
     <Doc_ID>1</Doc_ID> 
     <Vendor_Code>126400</Vendor_Code> 
     <Property_Code>10519</Property_Code> 
     <Invoice_Num>20509</Invoice_Num> 
    </ABC> 
</ABCRelease> 

说明

正确使用<xsl:element>AVT S(属性值模板)。

+0

谢谢你的回应!作品款待 – user1490231

+0

@ user1490231:不客气。 –

+0

对于OP来说工作正常,但是如何调整它以优雅地处理'FieldName'的值不是有效的元素名称,比如'“2”或“Doc ID”? – Flynn1179