2

私は少し頭痛の種である XSLT に取り組んでおり、いくつかのヒントを探していました。一部のタグには名前空間プレフィックスがあり、他のタグには含まれていない XML の変換に取り組んでいます。すべてのタグを 1 つの共通の名前空間プレフィックスに変換する作業を行っています。

XML の例:

<yes:Books>
   <no:Book>
      <Title>Yes</Title>
      <maybe:Version>1</maybe:Version>
   </no:Book>
</yes:Books>

私が取得しようとしているもの:

<yes:Books>
   <yes:Book>
      <yes:Title>Yes</yes:Title>
      <yes:Version>1</yes:Version>
   </yes:Book>
</yes:Books>

XML 入力は、さまざまな名前空間を返す複数の Web サービスの集合体です。私はそれを適切に集約することに問題はありません。それは私が問題を抱えている共通のプレフィックス名前空間を作成しています。

最悪の場合、それらを正規表現することもできますが、それはお勧めできません。

ありがとう。

4

2 に答える 2

2

この変換により、必要な最終プレフィックスとその名前空間を外部/グローバル パラメーターとして指定できます。属性名と同じ方法で処理する方法を示します

<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:param name="pPrefix" select="'yes'"/>
 <xsl:param name="pNamespace" select="'yes'"/>

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

 <xsl:template match="@*">
  <xsl:attribute name="{$pPrefix}:{local-name()}" namespace="{$pNamespace}">
   <xsl:value-of select="."/>
  </xsl:attribute>
 </xsl:template>
</xsl:stylesheet>

次のドキュメントに適用した場合(問題をより難しくするために 1 つの属性が追加された提供されたドキュメント):

<yes:Books xmlns:yes="yes">
    <no:Book xmlns:no="no">
        <Title no:Major="true">Yes</Title>
        <maybe:Version xmlns:maybe="maybe">1</maybe:Version>
    </no:Book>
</yes:Books>

必要な正しい結果が生成されます。

<yes:Books xmlns:yes="yes">
   <yes:Book>
      <yes:Title yes:Major="true">Yes</yes:Title>
      <yes:Version>1</yes:Version>
   </yes:Book>
</yes:Books>
于 2012-04-20T04:11:22.337 に答える
0
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:custom="c">
    <xsl:template match="/">
        <xsl:copy>
            <xsl:apply-templates select="node()|@*"/>
        </xsl:copy>
    </xsl:template>
    <xsl:template match="*">
        <xsl:element name="custom:{local-name()}" namespace-uri="c">
            <xsl:apply-templates/>
        </xsl:element>
    </xsl:template>
</xsl:stylesheet>
于 2012-04-20T03:20:50.653 に答える