0

子要素をトラバースできません。以下の入力 XML では、要素のみを取得<e>してそれを置き換える必要があり、値が「DB1」に等しい場合は<se>1 つの要素を削除する必要があります。<e>誰かがこれについて助けてくれますか?XSLT は初めてです。

入力 XML:

<a xmlns="http://examle.com/test/2.0" xmlns:xs="http://www.w3.org/2001/XMLSchema" >
  <b>
     <c name="RES" type="KSD">
     <d>
        <e>DB1</e>
        <e>DB2</e>
        <e>DB3</e>      
     </d>
    </c>
  </b>
  <error count="0" success="OK">
  </error>
</a>

必要な出力 XML は次のとおりです。

<?xml version="1.0" encoding="utf-8" ?>
<Payload xmlns="http://example.com/test/2.0"xmlns:xs="http://www.w3.org/2001/XMLSchema" >
    <response>
        <allot>8</allot>            
        <size>200</size>
        <ses>
            <se>DB2</se>
            <se>DB3</se>
        </ses>          
    </response>
</Payload>
4

2 に答える 2

0

あなたのニーズに最も近いと思われる解決策(かなりあいまいです)は

<?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" />

    <!-- identity template -->
    <xsl:template match="@*|node()">
      <xsl:copy>
        <xsl:apply-templates select="@*|node()"/>
      </xsl:copy>
    </xsl:template>

    <!-- rename -->
    <xsl:template match="a">
      <Payload>
        <xsl:apply-templates select="@*|node()"/>
      </Payload>
    </xsl:template>

    <!-- rename and add some new elements -->
    <xsl:template match="b">
      <response>
        <allot>8</allot>            
        <size>200</size>
        <xsl:apply-templates select="@*|node()"/>
      </response>
    </xsl:template>

    <!-- don't output this node but only its children -->
    <xsl:template match="c">
        <xsl:apply-templates select="@*|node()"/>
    </xsl:template>

    <!-- rename -->
    <xsl:template match="d">
      <ses>
        <xsl:apply-templates select="@*|node()"/>
      </ses>
    </xsl:template>

    <!-- rename -->
    <xsl:template match="e">
      <se>
        <xsl:apply-templates select="@*|node()"/>
      </se>
    </xsl:template>

    <!-- discard -->
    <xsl:template match="e[.='DB1']|error"/>

</xsl:stylesheet>

名前空間を処理できないためxmlns、入力から名前空間を削除したところ、機能しました。

于 2012-06-27T12:13:14.793 に答える
0

私はこのようなXSLT変換を書いています..

<xsl:stylesheet version="1.0"
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output omit-xml-declaration="yes" indent="yes" />
  <xsl:strip-space elements="*" />

  <xsl:template match="@*|comment()|processing-instruction()|text()">
    <xsl:copy-of select="."/>
  </xsl:template>

  <xsl:template match="*">
    <xsl:element name="{local-name()}">
      <xsl:apply-templates select="@*|node()"/>
    </xsl:element>
  </xsl:template>

  <xsl:template match="d" >
    <Payload xmlns="http://example.com/test/2.0" xmlns:xs="http://www.w3.org/2001/XMLSchema" >
      <response>
        <allot>8</allot>
        <size>200</size>
        <ses>
          <xsl:for-each select="e">
            <xsl:variable name="e_name" select="."></xsl:variable>
            <xsl:if test="$e_name != 'DB1'">
              <se>
                <xsl:value-of select="." />
              </se>
            </xsl:if>
          </xsl:for-each>
        </ses>
      </response>
    </Payload>
  </xsl:template>

</xsl:stylesheet>
于 2012-06-28T04:35:44.197 に答える