XSLT转换

3

我有一个XML文件:

<?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,今天花了很多时间却没有取得太大进展,对此我进行了很多搜索。是否有人能帮助我并提供一些示例代码来实现这个功能呢?

我的问题在于提取FieldName的值并将其插入到<>中,例如:

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

为了实现

<Doc_Id>1345</Doc_Id>

非常希望您能提供帮助。

史蒂文


注意基于属性值创建元素时要小心,如果“FieldName”属性包含不能用作元素名称的值,例如数字值或带有空格的名称,则需要进行转换。只要您完全控制所使用的值,这不应该会给您带来问题,但这绝对是需要注意的事情。 - Flynn1179
1个回答

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(属性值模板)。


谢谢您的回复!非常有效。 - user1490231
对于原始问题,这个方案可以正常工作,但是如果FieldName的值不是有效的元素名称,比如"2"或"Doc Id",你该如何优雅地处理它呢? - Flynn1179
@Flynn1179 - 我会询问客户他们的需求是什么。 - Michael Kay
@Flynn1179:一个合理的问题--必须向原帖作者提出。 - Dimitre Novatchev
只是跟进一下这个问题。目前代码运行良好,但现在我需要不使用所有FieldName的组件来生成Result。这段代码获取所有项目并用新格式表示它们。是否可能仅选择其中两个组件来表示结果?即仅输出Doc_ID和Property_Code组件。我可以直接调用它们而不是使用{@FieldName}和select=”.”行吗? - user1490231
@user1490231,请提出一个新问题——自从回答这个问题已经过去了六个多月。 - Dimitre Novatchev

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接