これに沿って出力を生成する必要があるXSLがあります。
<moo xmlns="http://api.example.com">
<foo>1358944586848</foo>
<bar>
<a>1</a>
<b>2</b>
<c>3</c>
</bar>
</moo>
私はこのようにそれを行うことができます:
<xsl:stylesheet version="2.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns="http://api.example.com">
<xsl:template match="/">
<xsl:element name="moo">
<!-- and so on -->
ただし、xslファイルでxslプレフィックスを使用するのは嫌いです。これは、xslがかなり乱雑になっていると感じるためです。xpath-default-namespace
必要に応じて変換元に設定できるため、XPathでの選択はとにかく簡単です。しかしelement-default-namespace
、私が見る限り利用できるものはありません。それでは、どうすれば必要な出力を適切に生成できますか?
私はこれができることを知っています:
<stylesheet version="2.0"
xmlns="http://www.w3.org/1999/XSL/Transform">
<template match="/">
<element name="moo" namespace="http://api.example.com">
<!-- and so on -->
ただし、作成するすべての要素にこの名前空間を明示的に設定する必要があります。そうしないと、代わりにXSL名前空間になります。それで、xslファイルのデフォルトの名前空間に触れずに特定の名前空間(プレフィックスなし)で要素を作成するクリーンな方法はありますか?
アップデート:
おそらくnamespace-alias
何かをすることができると考えましたが、それを使用する方法を理解することはできません。これを試しましたが、出力にまったく違いがないようです。
<stylesheet version="2.0"
xmlns="http://www.w3.org/1999/XSL/Transform"
xmlns:out="http://api.example.com">
<namespace-alias stylesheet-prefix="out" result-prefix=""/>
<template match="/">
<element name="out:moo">
<!-- and so on -->
namespace-alias
おそらく、私が思っていることをしていないのでしょう:p
JLRisheの回答に基づいて、私が使用した最終的な解決策
remove-prefixes.xsl
<?xml version="1.0" encoding="UTF-8"?>
<stylesheet version="2.0" xmlns="http://www.w3.org/1999/XSL/Transform">
<template match="/">
<variable name="result">
<next-match />
</variable>
<apply-templates select="$result" mode="remove-prefixes" />
</template>
<template match="*" priority="1" mode="remove-prefixes">
<element name="{local-name()}" namespace="{namespace-uri()}">
<apply-templates select="@* | node()" mode="remove-prefixes" />
</element>
</template>
<template match="@*|node()" mode="remove-prefixes">
<copy>
<apply-templates select="@* | node()" mode="remove-prefixes" />
</copy>
</template>
</stylesheet>
subject.xsl
<!-- snip -->
<import href="remove-prefixes.xsl" />
<!-- snip -->