XSLT帮助!将任何结构转换为名称值对

时间:2015-03-17 00:41:34

标签: xml xslt

  

将以下xml转换为名称值对。任何结构

    <root>
    <abc>
    <element_1>"<value-of select='a'>"</element_1>
    <element_2>"<value-of select='b'>"</element_2>
    </abc>
    <xyz>
    <element_3>"<value-of select='c'>"</element_3>
    </xyz>
    <element_4>"<value-of select='d'>"</element_4>
    </root>

1 个答案:

答案 0 :(得分:0)

试试这个(从这篇文章中借鉴了很多:How do you output the current element path in XSLT?):

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="xml" indent="yes"/>

    <xsl:template match="text()"/>

    <xsl:template match="/">
        <root>
            <xsl:apply-templates></xsl:apply-templates>
        </root>
    </xsl:template>

    <xsl:template match="*">
        <xsl:element name="udf">
            <xsl:element name="name">
                <xsl:for-each select="ancestor-or-self::*">
                    <xsl:value-of select="concat('/',local-name())"/>
                    <xsl:if test="(preceding-sibling::*|following-sibling::*)[local-name()=local-name(current())]">
                        <xsl:value-of select="concat('[',count(preceding-sibling::*[local-name()=local-name(current())])+1,']')"/>
                    </xsl:if>
                </xsl:for-each>
            </xsl:element>

            <xsl:element name="value">
                <xsl:value-of select="./text()"/>
            </xsl:element>
        </xsl:element>    
        <xsl:apply-templates select="node()"/>

    </xsl:template>

</xsl:stylesheet>

输入:

<document>
  <blah>asdf</blah>
  <blah>fdsa</blah>
  <blah2>asdf2</blah2>
  <blah3 />
  <blah4><blah5>test3</blah5><blah6/>mixed</blah4>
  <blah4><blah5>test4</blah5></blah4>
</document>

输出:

<?xml version="1.0" encoding="UTF-8"?>
<root>
   <udf>
      <name>/document</name>
      <value>
    </value>
   </udf>
   <udf>
      <name>/document/blah[1]</name>
      <value>asdf</value>
   </udf>
   <udf>
      <name>/document/blah[2]</name>
      <value>fdsa</value>
   </udf>
   <udf>
      <name>/document/blah2</name>
      <value>asdf2</value>
   </udf>
   <udf>
      <name>/document/blah3</name>
      <value/>
   </udf>
   <udf>
      <name>/document/blah4[1]</name>
      <value>mixed</value>
   </udf>
   <udf>
      <name>/document/blah4[1]/blah5</name>
      <value>test3</value>
   </udf>
   <udf>
      <name>/document/blah4[1]/blah6</name>
      <value/>
   </udf>
   <udf>
      <name>/document/blah4[2]</name>
      <value/>
   </udf>
   <udf>
      <name>/document/blah4[2]/blah5</name>
      <value>test4</value>
   </udf>
</root>

XSLTransform.net:http://xsltransform.net/jyH9rMu/2