0

あなたの助けが必要です。

XML: 次の SOAP メッセージがあります。

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
<soapenv:Header/>
<soapenv:Body>
 <Service>
  <ServiceRequest>
   <tag3>value3</tag3>
  </ServiceRequest>
 </Service>
</soapenv:Body>
</soapenv:Envelope>

XSL: XML プロパティからノードを追加する必要があります。私はこのxslで試します:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns="http://www.w3.org/1999/xhtml">
<xsl:output encoding="UTF-8" indent="yes" method="xml" standalone="no" omit-xml-declaration="no"/>
<xsl:variable name="props">
<properties>
 <property>
  <key>tag1</key>
  <value>value1</value>
 </property>
 <property>
  <key>tag2</key>
  <value>value2</value>
 </property>
</properties>
</xsl:variable>

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

<xsl:template match="ServiceRequest">
<xsl:copy>
 <xsl:apply-templates select="@* | node()" />
  <xsl:for-each select="$props/properties/property">
   <xsl:variable name="tag" select="key" />
   <xsl:element name="{$tag}">
    <xsl:value-of select="value" />
   </xsl:element>
  </xsl:for-each>
 </xsl:copy>
</xsl:template>
</xsl:stylesheet>

XSL 後の XML: 次のような結果が必要です。

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
<soapenv:Header/>
<soapenv:Body>
 <Service>
  <ServiceRequest>
   <tag1>value1</tag1>
   <tag2>value2</tag2>
   <tag3>value3</tag3>
  </ServiceRequest>
 </Service>
</soapenv:Body>
</soapenv:Envelope>

しかし、XSL は機能しません。助けてください。

4

1 に答える 1

0

問題は、XSLT にはデフォルトの名前空間xmlns="http://www.w3.org/1999/xhtmlがあるため、propertiesandproperty要素がその名前空間にありselect="$props/properties/property"、null 名前空間で要素を探しているため、何にも一致しないことです。

デフォルトの名前空間は必要ないように思われるため、最も簡単な解決策は削除することです。

もう 1 つの考えられる問題は、$prop変数にノード セットではなく XML フラグメントが含まれていることです。これは、変数を で使用する前にノード セットに変換する必要があることを意味しますfor-each。これは、実装に依存する XSLT 拡張関数で行われます。

Microsoft XSLT プロセッサを使用すると、正しい XSLT は次のようになります。

 <xsl:stylesheet 
  version="1.0" 
  xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
  xmlns:msxsl="urn:schemas-microsoft-com:xslt" 
  exclude-result-prefixes="msxsl">

  <xsl:output encoding="UTF-8" indent="yes" method="xml" standalone="no" omit-xml-declaration="no"/>
  <xsl:variable name="props">
    <properties>
      <property>
        <key>tag1</key>
        <value>value1</value>
      </property>
      <property>
        <key>tag2</key>
        <value>value2</value>
      </property>
    </properties>
  </xsl:variable>

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

  <xsl:template match="ServiceRequest">
    <xsl:copy>
      <xsl:apply-templates select="@* | node()" />
      <xsl:for-each select="msxsl:node-set($props)/properties/property">
        <xsl:variable name="tag" select="key" />
        <xsl:element name="{$tag}">
          <xsl:value-of select="value" />
        </xsl:element>
      </xsl:for-each>
    </xsl:copy>
  </xsl:template>
</xsl:stylesheet>
于 2013-09-05T15:09:53.610 に答える