0

私は次のxmlを持っています

<?xml version="1.0" encoding="UTF-8"?>
<response>
    <lst name="somename">
        <node1></node1>
        <node2></node2>
    </lst>
    <result name="somename" count="5">
        <doc>
            <str name="NodeA">ValueA</str>
            <str name="NodeB">ValueB</str>
            <str name="NodeC">ValueC</str>
        </doc>
        <doc>
            <str name="NodeA">ValueD</str>
            <str name="NodeB">ValueE</str>
            <str name="NodeC">ValueF</str>
        </doc>
    </result>
</response>

に変換したい

<?xml version="1.0" encoding="UTF-8"?>
<response>
    <doc>
        <NodeA>ValueA</NodeA>
        <NodeB>ValueB</NodeB>
        <NodeC>ValueC</NodeC>
    </doc>
    <doc>
        <NodeA>ValueD</NodeA>
        <NodeB>ValueE</NodeB>
        <NodeC>ValueF</NodeC>
    </doc>
</response>

ご覧のとおり、lst ノードは完全に削除され、属性値がノードになりました。

まず、この xslt コードを使用して lst ノードを削除しました。

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes" />
    <xsl:template match="node() | @*">
        <xsl:copy>
            <xsl:apply-templates select="node() | @*"/>
        </xsl:copy>
    </xsl:template>
    <xsl:template match="lst"/>
</xsl:stylesheet>

私にこれをくれた

<?xml version="1.0" encoding="UTF-8"?>
<response>
    <result name="somename" count="5">
        <doc>
            <str name="NodeA">ValueA</str>
            <str name="NodeB">ValueB</str>
            <str name="NodeC">ValueC</str>
        </doc>
        <doc>
            <str name="NodeA">ValueD</str>
            <str name="NodeB">ValueE</str>
            <str name="NodeC">ValueF</str>
        </doc>
    </result>
</response>

次に、リンクからこのxsltを使用しました[リンク]属性値を要素に変換します

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes" />
    <xsl:template match="response/result/doc">
        <xsl:copy>
            <xsl:apply-templates select="@* | node()" />
        </xsl:copy>
    </xsl:template>
    <xsl:template match="token">
        <xsl:element name="{@name}">
            <xsl:apply-templates />
        </xsl:element>
    </xsl:template>
</xsl:stylesheet>

しかし、それは役に立ちませんでした。これをくれました。

<?xml version="1.0" encoding="utf-8"?>
<doc>ValueAValueBValueC</doc>
<doc>ValueDValueEValueF</doc>

属性値をノードに変換する 2 番目の部分を手伝ってください。1 つの xslt でこれらの両方を行うことは可能ですか?

4

3 に答える 3

1

現在のものに非常に近い 1 つの XSLT ですべての目標を達成できます。

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes" />
    <xsl:strip-space elements="*" />

    <!-- copy everything as-is apart from exceptions below -->
    <xsl:template match="node() | @*">
        <xsl:copy>
            <xsl:apply-templates select="node() | @*"/>
        </xsl:copy>
    </xsl:template>

    <!-- delete lst -->
    <xsl:template match="lst"/>

    <!-- strip out the result element but still include its children -->
    <xsl:template match="result">
      <xsl:apply-templates />
    </xsl:template>

    <!-- convert str name="X" to X -->
    <xsl:template match="str">
      <xsl:element name="{@name}">
        <xsl:apply-templates />
      </xsl:element>
    </xsl:template>
</xsl:stylesheet>
于 2013-03-15T14:20:48.560 に答える
0

これを基礎として使用できます

XSLアノテーションと呼ばれるものを除くすべての要素をコピーする方法

<?xml version="1.0"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:xsd="http://www.w3.org/2001/XMLSchema" version="1.0">

    <xsl:template match="*|/">
        <xsl:copy>
            <xsl:copy-of select="@*"/>
            <xsl:apply-templates/>
        </xsl:copy>
    </xsl:template>

    <!-- copy xsd:annotation and children, but don't copy the attributes -->
   <xsl:template match="xsd:annotation">

        <xsd:annotation>
            <xsl:copy-of select="*"/>
        </xsd:annotation>

    </xsl:template> 

</xsl:stylesheet>
于 2013-03-15T14:04:58.483 に答える
0

これはそれを行います:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes" />
  <xsl:template match="node()">
    <xsl:copy>
      <xsl:apply-templates />
    </xsl:copy>
  </xsl:template>

  <xsl:template match="lst"/>

  <xsl:template match="str[@name]">
    <xsl:element name="{@name}">
      <xsl:apply-templates  />
    </xsl:element>
  </xsl:template>
</xsl:stylesheet>

サンプル入力で実行すると、次が生成されます。

<response>
  <result>
    <doc>
      <NodeA>ValueA</NodeA>
      <NodeB>ValueB</NodeB>
      <NodeC>ValueC</NodeC>
    </doc>
    <doc>
      <NodeA>ValueD</NodeA>
      <NodeB>ValueE</NodeB>
      <NodeC>ValueF</NodeC>
    </doc>
  </result>
</response>
于 2013-03-15T14:25:39.447 に答える