输入xml以使用xslt输出xml转换

时间:2013-02-15 03:46:54

标签: xml xslt transform

我有一个输入和所需的输出xml文件,但不能为此编写通用的xsl转换器。这里有人可以帮帮我吗?地址/计费在运行时可能有更多元素,应该直接复制到主人块。

<searchPersonResponse>
 <persons>
  <person>
   <name>name2</name>
   <address>
   <billing>
     <city>xx</city>
     <state>yyyy</state>
     <zip>zzzzz</zip>
   </billing>
   </address>
  </person>
  <person>
    <name>name1</name>
    <address>
      <billing>
       <city>xx</city>
       <state>yyyy</state>
       <zip>zzzzz</zip>
      </billing>
    </address>
   </person>
  </persons>
 </searchPersonResponse>

所需的输出xml

<searchPersonResponse>
 <persons>
  <person>
     <name>name2</name>
     <city>xx</city>
     <state>yyyy</state>
     <zip>zzzzz</zip>
  </person>
  <person>
       <name>name1</name>
       <city>xx</city>
       <state>yyyy</state>
       <zip>zzzzz</zip>
   </person>
  </persons>
 </searchPersonResponse>

1 个答案:

答案 0 :(得分:2)

已编辑:当地址与结算子女一起出现时,OP只希望“解包”地址和结算元素。 XSLT现在可以做到这一点。此外,OP提到需要一个XSLT 1.0解决方案;没有使用XSLT 2.0功能,所以我只是将版本更改为“1.0”。

此XSLT:

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    version="1.0">
    <xsl:template match="@*|node()">
        <xsl:copy>
                <xsl:apply-templates/>
        </xsl:copy>
    </xsl:template>

    <xsl:template match="address[child::billing]|billing[parent::address]">
        <xsl:apply-templates/>
    </xsl:template>
</xsl:stylesheet>

应用于此XML时:

<searchPersonResponse>
    <persons>
        <person>
            <name>name2</name>
            <address>
                <billing>
                <city>xx</city>
                <state>yyyy</state>
                <zip>zzzzz</zip>
                </billing>
            </address>
        </person>
        <person>
            <name>name1</name>
            <address>
                <billing>
                <city>xx</city>
                <state>yyyy</state>
                <zip>zzzzz</zip>
                </billing>
            </address>
        </person>
    </persons>
</searchPersonResponse>

产生所需的结果:

<searchPersonResponse>
    <persons>
        <person>
            <name>name2</name>
            <city>xx</city>
            <state>yyyy</state>
            <zip>zzzzz</zip>
        </person>
        <person>
            <name>name1</name>
            <city>xx</city>
            <state>yyyy</state>
            <zip>zzzzz</zip>
        </person>
    </persons>
</searchPersonResponse>

身份模板将复制所有节点和属性。地址和帐单匹配模板(与任一元素匹配)将复制他们的孩子而不是他们自己。