使用XSLT进行XML节点转换的XML值?

时间:2013-09-26 08:56:41

标签: xslt

我正在尝试编写XSLT文件以跟随输入XML输出XML,是否有可能XSLT将输入xml的值转换为输出XML中的节点?我该如何实现呢?

输入XML

<?xml version="1.0" encoding="UTF-8"?>
<Rows>
 <Row><xml_data_name/> <xml_data_value/> </Row>
 <Row><xml_data_name>persons</xml_data_name> <xml_data_value/> </Row>
 <Row><xml_data_name>person</xml_data_name> <xml_data_value/> </Row>
 <Row><xml_data_name>username</xml_data_name> <xml_data_value>JS1</xml_data_value> </Row>
 <Row><xml_data_name>name</xml_data_name> <xml_data_value/> </Row>
 <Row><xml_data_name>name</xml_data_name> <xml_data_value>John</xml_data_value> </Row>
 <Row><xml_data_name>name</xml_data_name> <xml_data_value/> </Row>
 <Row><xml_data_name>family-name</xml_data_name> <xml_data_value/> </Row>
 <Row><xml_data_name>family-name</xml_data_name> <xml_data_value>Smith</xml_data_value> </Row>
 <Row><xml_data_name>family-name</xml_data_name> <xml_data_value/> </Row>
 <Row><xml_data_name>person</xml_data_name> <xml_data_value/> </Row>
 <Row><xml_data_name>person</xml_data_name> <xml_data_value/> </Row>
 <Row><xml_data_name>username</xml_data_name> <xml_data_value>MI1</xml_data_value> </Row>
 <Row><xml_data_name>name</xml_data_name> <xml_data_value/> </Row>
 <Row><xml_data_name>name</xml_data_name> <xml_data_value>Morka</xml_data_value> </Row>
 <Row><xml_data_name>name</xml_data_name> <xml_data_value/> </Row>
 <Row><xml_data_name>family-name</xml_data_name> <xml_data_value/> </Row>
 <Row><xml_data_name>family-name</xml_data_name> <xml_data_value>Ismincius</xml_data_value> </Row>
 <Row><xml_data_name>family-name</xml_data_name> <xml_data_value/> </Row>
 <Row><xml_data_name>person</xml_data_name> <xml_data_value/> </Row>
 <Row><xml_data_name>persons</xml_data_name> <xml_data_value/> </Row>
 <Row><xml_data_name/> <xml_data_value/> </Row>
</Rows>

输出XML

<?xml version="1.0" ?>
<persons>
  <person username="JS1">
    <name>John</name>
    <family-name>Smith</family-name>
  </person>
  <person username="MI1">
    <name>Morka</name>
    <family-name>Ismincius</family-name>
  </person>
</persons>

2 个答案:

答案 0 :(得分:1)

您当然可以使用xsl:element之类的

<xsl:template match="Row">
    <!-- Note {} brackets in name attribute -->
    <xsl:element name="{xml_data_name}">
        <xsl:value-of select="xml_data_value" />
    </xsl:element>
</xsl:template>

什么是更大的问题是输出结构,因为不容易确定哪些行应该嵌套,哪些行应该转换为属性而不是元素等。

答案 1 :(得分:0)

嗯,这是我见过的最奇怪的数据格式之一!你确定你不能得到任何产生的东西来产生更合理的东西吗?

我认为解决方案必须是递归:你需要一个以一系列行作为输入的函数;它输出一个元素,其名称是序列中第一个元素的名称,没有数据值,其内容是通过递归调用获得的,该调用将第一行之后的所有行传递到下一行,没有数据值和相同的名称,然后调用自己处理该行之后的所有行。不容易,而且肯定比我允许自己回答SO问题需要更多的时间!