わかりました、この質問にはさまざまなバリエーションがありますが、私が解決しようとしていることに正確に答えている人はいません。おそらく、私がやろうとしていることに他の答えの1つを適用する方法がわかりません.
次のような XML があります。
<?xml version="1.0" encoding="utf-8"?>
<message>
<cmd id="api_info">
<api-version>1.0</api-version>
<api-build>1.0.0.0</api-build>
</cmd>
</message>
これで、この XML に適用する XSLT 変換ができました。XSLT は次のようになります。
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:fo="http://www.w3.org/1999/XSL/Format"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:fn="http://www.w3.org/2005/xpath-functions"
version="2.0">
<xsl:output method="xml" version="1.0" indent="yes"/>
<xsl:template match="/">
<xsl:apply-templates select="message"/>
</xsl:template>
<xsl:template match="message">
<xsl:element name="message" xmlns="http://www.companyname.com/schemas/product/Version001">
<xsl:apply-templates select="/message/cmd/@id"/>
</xsl:element>
</xsl:template>
<xsl:template match="/message/cmd/@id">
<xsl:variable name="_commandType" select="/message/cmd/@id"/>
<xsl:element name="messageHeader">
<xsl:element name="cmdType">
<xsl:value-of select="$_commandType"/>
</xsl:element>
</xsl:element>
<xsl:element name="messageBody">
<xsl:choose>
<xsl:when test="$_commandType = 'api_info'">
<xsl:element name="apiInfoBody">
<xsl:element name="apiVersion">
<xsl:value-of select="/message/cmd/api-version"/>
</xsl:element>
<xsl:element name="apiBuild">
<xsl:value-of select="/message/cmd/api-build"/>
</xsl:element>
</xsl:element>
</xsl:when>
<xsl:when test="$_commandType = 'communicationError'">
<xsl:element name="communicationErrorBody">
<xsl:element name="errorCode">
<xsl:value-of select="error-code"/>
</xsl:element>
<xsl:element name="badCmd">
<xsl:value-of select="bad-cmd"/>
</xsl:element>
</xsl:element>
</xsl:when>
</xsl:choose>
</xsl:element>
</xsl:template>
</xsl:stylesheet>
私が得る出力は、基本的に私が望むものであり、次のようになります。
<?xml version="1.0" encoding="UTF-8"?>
<message xmlns="http://www.companyname.com/schemas/product/Version001">
<messageHeader xmlns="">
<cmdType>api_info</cmdType>
</messageHeader>
<messageBody xmlns="">
<apiInfoBody>
<apiVersion>1.0</apiVersion>
<apiBuild>1.0.0.0</apiBuild>
</apiInfoBody>
</messageBody>
</message>
しかし、私が望んでいないのは、<messageHeader> 要素と <messageBody> 要素のxmlns = " "属性です。
これらの要素の XSLT で名前空間を明示的に指定すると、不要な属性がそれらの属性の子に 1 レベル下にプッシュされることがわかりました。
XSLT 全体を調べて、xmlns="" http://www.companyname.com/schemas/product/Version001 "属性を各xsl:element定義に明示的に追加することもできますが、より洗練された方法. 私たちプログラマーは怠惰すぎて, この種のナンセンスのショートカットを持たない. 私のXSLTが短縮された例のように単純なもので構成されていない場合, 私はそのようにしたくなる. しかし、私はそこを知っている.より良い方法でなければなりません。
ここで何が欠けているか知っている人はいますか?
ありがとう、
アラームトリッパー