0

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

<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>
4

1 回答 1

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>

身份模板将复制所有节点和属性。地址和帐单匹配模板(匹配任一元素)将复制其子代,但不会复制它们自己。

于 2013-02-15T03:51:04.410 回答