私はXSLTを初めて使用していて、いくつかのボイラープレートの名前空間処理に戸惑うことがあります。 同じURIの既定の名前または別のプレフィックス付き名前空間を持つXSLT 2.0フレキシブル
私は目標は、単に一つの要素名前を変更することで、次のXSLTいます<ACORD xmlns="http://www.ACORD.org/standards/PC_Surety/ACORD1/xml/">
<InsuranceSvcRq>
<BOPPolicyQuoteInqRq>
<RqUID>E2BA6308-62D5-43AC-B8C1-7616FDFE9C98</RqUID>
</BOPPolicyQuoteInqRq>
</InsuranceSvcRq>
</ACORD>
しかし、この意味的に同等のXMLは失敗します:予想通り、次のXMLの変換
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xpath-default-namespace="http://www.ACORD.org/standards/PC_Surety/ACORD1/xml/" >
<xsl:strip-space elements="*" />
<!-- element template that copies over elements -->
<xsl:template match="*">
<xsl:element name="{name()}">
<xsl:apply-templates select="@* | node()"/>
</xsl:element>
</xsl:template>
<!-- attribute template to copy attributes over -->
<xsl:template match="@*">
<xsl:copy>
<xsl:attribute name="{name()}"><xsl:value-of select="."/></xsl:attribute>
</xsl:copy>
</xsl:template>
<!-- "other" template to copy the rest of the nodes -->
<xsl:template match="comment() | text() | processing-instruction()">
<xsl:copy/>
</xsl:template>
<!-- Rename an element -->
<xsl:template match="BOPPolicyQuoteInqRq/RqUID" >
<xsl:element name="RqUUID">
<xsl:apply-templates select="node()|@*"/>
</xsl:element>
</xsl:template>
</xsl:stylesheet>
ワークス
<bloat:ACORD xmlns:bloat="http://www.ACORD.org/standards/PC_Surety/ACORD1/xml/">
<bloat:InsuranceSvcRq>
<bloat:BOPPolicyQuoteInqRq>
<bloat:RqUID>E2BA6308-62D5-43AC-B8C1-7616FDFE9C98</bloat:RqUID>
</bloat:BOPPolicyQuoteInqRq>
</bloat:InsuranceSvcRq>
</bloat:ACORD>
エラーは次のとおりです。
Caused by: net.sf.saxon.trans.XPathException: Undeclared prefix in element name: bloat
at net.sf.saxon.expr.instruct.ComputedElement.getElementName(ComputedElement.java:429)
at net.sf.saxon.expr.instruct.ElementCreator.processLeavingTail(ElementCreator.java:388)
at net.sf.saxon.expr.instruct.ElementCreator.processLeavingTail(ElementCreator.java:371)
at net.sf.saxon.expr.instruct.Template.applyLeavingTail(Template.java:239)
at net.sf.saxon.trans.Mode.applyTemplates(Mode.java:1056)
at net.sf.saxon.trans.TextOnlyCopyRuleSet.process(TextOnlyCopyRuleSet.java:65)
at net.sf.saxon.trans.Mode.applyTemplates(Mode.java:1044)
at net.sf.saxon.Controller.transformDocument(Controller.java:2088)
at net.sf.saxon.Controller.transform(Controller.java:1911)
at org.apache.camel.builder.xml.XsltBuilder.process(XsltBuilder.java:141)
at org.apache.camel.impl.ProcessorEndpoint.onExchange(ProcessorEndpoint.java:103)
at org.apache.camel.component.xslt.XsltEndpoint.onExchange(XsltEndpoint.java:121)
at org.apache.camel.impl.ProcessorEndpoint$1.process(ProcessorEndpoint.java:71)
at org.apache.camel.util.AsyncProcessorConverterHelper$ProcessorToAsyncProcessorBridge.process(AsyncProcessorConverterHelper.java:61)
at org.apache.camel.processor.SendProcessor.process(SendProcessor.java:141)
at org.apache.camel.processor.RedeliveryErrorHandler.process(RedeliveryErrorHandler.java:460)
at org.apache.camel.processor.CamelInternalProcessor.process(CamelInternalProcessor.java:190)
at org.apache.camel.processor.Pipeline.process(Pipeline.java:121)
at org.apache.camel.processor.Pipeline.process(Pipeline.java:83)
at org.apache.camel.processor.CamelInternalProcessor.process(CamelInternalProcessor.java:190)
at org.apache.camel.component.direct.DirectProducer.process(DirectProducer.java:62)
at org.apache.camel.processor.CamelInternalProcessor.process(CamelInternalProcessor.java:190)
at org.apache.camel.util.AsyncProcessorHelper.process(AsyncProcessorHelper.java:109)
at org.apache.camel.processor.UnitOfWorkProducer.process(UnitOfWorkProducer.java:68)
at org.apache.camel.impl.ProducerCache$2.doInProducer(ProducerCache.java:412)
at org.apache.camel.impl.ProducerCache$2.doInProducer(ProducerCache.java:380)
at org.apache.camel.impl.ProducerCache.doInProducer(ProducerCache.java:270)
at org.apache.camel.impl.ProducerCache.sendExchange(ProducerCache.java:380)
at org.apache.camel.impl.ProducerCache.send(ProducerCache.java:221)
at org.apache.camel.impl.DefaultProducerTemplate.send(DefaultProducerTemplate.java:124)
at org.apache.camel.impl.DefaultProducerTemplate.sendBody(DefaultProducerTemplate.java:137)
... 32 more
は、1つの接頭辞を宣言し、他方が(私も言ってベンチャーうしないので、遠くのXML仕様に関するされるように、XSLTトランスフォーマがハングアップしつつあるように、これらXMLSは意味的に等価であっても表示されます「foo」という接頭辞が付いていて、「bar」が付いているものがある場合は、ハングアップします)。
私は、特定の接頭辞または名前空間を特定の方法で宣言するように私にXMLを渡すクライアントを強制できない位置にいます。私は明日別のプレフィックスエイリアスを使用することを決断しないことも保証できません。
xpath-default-namespace
属性を宣言したことは、既定のプレフィックスとして宣言されるかどうかにかかわらず、xsltトランスフォーマーに、ドキュメント全体がどのような名前空間URIに関連付けられるか、接頭辞にも「rainbowunicorns」という別名が付いています。
正確には属性xpath-default-namespace
は何を行いますか、クライアントが決定する名前空間宣言のフレーバに関係なく、意味的に同等の名前空間を適切に処理できる柔軟なXSLTをどのように記述できますか?
スペック該当する場合: 両方XMLS(マーティンHonnenの礼儀)で動作する変換更新キャメル2.16.2 サクソン-HE 9.5.1-8
:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xpath-default-namespace="http://www.ACORD.org/standards/PC_Surety/ACORD1/xml/" >
<xsl:strip-space elements="*" />
<!-- element template that copies over elements -->
<xsl:template match="@* | node()">
<xsl:copy>
<xsl:apply-templates select="@* | node()" />
</xsl:copy>
</xsl:template>
<!-- "other" template to copy the rest of the nodes -->
<xsl:template match="comment() | processing-instruction()">
<xsl:copy/>
</xsl:template>
<!-- Rename an element -->
<xsl:template match="BOPPolicyQuoteInqRq/RqUID" >
<xsl:element name="RqUUID" namespace="{namespace-uri()}">
<xsl:apply-templates select="node()|@*"/>
</xsl:element>
</xsl:template>
</xsl:stylesheet>
<xsl:element name="{name()}" namespace="{namespace-uri()}">
、あなたが好む場合にしたい場合は、あなたが提案された変更のそれぞれが終了した理由として説明を提供することをいとわないだろう仕事は? Sidenote:私はまた、|私の "他の"ルールのtext()部分がこれらの変更と組み合わされると、あいまいなルールセットが作成されました(xsltトランスフォーマーは本当にエラーを出してくれました。 _why_ – Russを学びたいだけです。もう一度考えてみましょう。上記の提案は入力のデフォルトの名前空間で失敗することは明らかです。その場合、構築された名前は ':RqUUID'となります。私は両方のタイプの入力で動作するコードを書く方法を試してみる必要があります。 –
基本的には、ノードをそのままコピーしたいのであれば、私が最初に提案したテンプレートで始めるのが一般的な方法です(それぞれ3つは見落としていました) 'xsl:copy'はスコープ内の名前空間をコピーしますが、' xsl:element'を使ってそれをしないとコピーします。 –