1

XSL / XMLを初めて使用するので、XSL変換のサポートが必要です。

私はこのように始まるXMLを持っています

<?xml version="1.0" encoding="UTF-8"?>
<Invoice
  xmlns="urn:oasis:names:specification:ubl:schema:xsd:Invoice-2"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="urn:oasis:names:specification:ubl:schema:xsd:Invoice-2 ../ws/Invoice.xsd"
  xmlns:cac="urn:oasis:names:specification:ubl:schema:xsd:CommonAggregateComponents-2"
  xmlns:cbc="urn:oasis:names:specification:ubl:schema:xsd:CommonBasicComponents-2"
  xmlns:sac="urn:oasis:names:specification:ubl:schema:xsd:SignatureAggregateComponents-2"
  xmlns:ext="urn:oasis:names:specification:ubl:schema:xsd:CommonExtensionComponents-2"
  xmlns:sig="urn:oasis:names:specification:ubl:schema:xsd:CommonSignatureComponents-2">
<ext:UBLExtensions>
  <ext:UBLExtension>
    <cbc:ID>INVOICE1</cbc:ID>
<cbc:Name>InvoiceIssuePlaceData</cbc:Name>
    <ext:ExtensionAgencyURI>urn:invoice:hr:issueplace</ext:ExtensionAgencyURI>
    <ext:ExtensionContent>
      <ext:InvoiceIssuePlace>London</ext:InvoiceIssuePlace>
    </ext:ExtensionContent>
  </ext:UBLExtension>
</ext:UBLExtensions>
<cbc:UBLVersionID>2.1</cbc:UBLVersionID>
<cbc:ID>01 1206-2406-568</cbc:ID>
</Invoice>

すべての属性の要素を作成し、属性を持つノードの値の<_>タグの間に要素を作成したいと思います。

これがxslです...

<?xml version='1.0' encoding='utf-8' ?>
<xsl:stylesheet 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
  xmlns="urn:oasis:names:specification:ubl:schema:xsd:Invoice-2"
  xmlns:cac="urn:oasis:names:specification:ubl:schema:xsd:CommonAggregateComponents-2"
  xmlns:cbc="urn:oasis:names:specification:ubl:schema:xsd:CommonBasicComponents-2"
  xmlns:ext="urn:oasis:names:specification:ubl:schema:xsd:CommonExtensionComponents-2"
  xmlns:sig="urn:oasis:names:specification:ubl:schema:xsd:CommonSignatureComponents-2"
  xmlns:sac="urn:oasis:names:specification:ubl:schema:xsd:SignatureAggregateComponents-2"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="urn:oasis:names:specification:ubl:schema:xsd:Invoice-2 ../ws/Invoice.xsd"
  version="1.0">
  <xsl:output method="xml"/>
   <xsl:template match="/">
     <xsl:apply-templates/>
   </xsl:template>
   <xsl:template match="@*|*|text()">
    <xsl:copy>
     <xsl:apply-templates select="@*|*|text()"/>
    </xsl:copy>
   </xsl:template>
   <xsl:template match="*[@*]">
    <xsl:element name="{name()}">
     <xsl:if test="count(@*)>=count(node())">
      <_>
       <xsl:value-of select="."/>
      </_>
     </xsl:if>
     <xsl:for-each select="@*">
      <xsl:element name="{name()}">
       <xsl:value-of select="."/>
      </xsl:element>
     </xsl:for-each>
     <xsl:if test="count(node())>count(@*)">
      <xsl:apply-templates select="*|text()"/>
     </xsl:if> 
    </xsl:element>
   </xsl:template>
</xsl:stylesheet>

問題は、この変換では、必要に応じてルートノード(請求書)が変換されないことです。私が得ている:

<?xml version="1.0"?>
<Invoice xmlns="urn:oasis:names:specification:ubl:schema:xsd:Invoice-2">
  <xsi:schemaLocation xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">urn:oasis:names:specification:ubl:schema:xsd:Invoice-2 ../ws/Invoice.xsd</xsi:schemaLocation>

請求書および新しい要素としての他の属性はありません。xsi:schemaLocationのみですが、そのノードのレベルで名前空間が定義されています。

私が間違っているのは何ですか?

ありがとう。

4

2 に答える 2

1

このスタイルシート...

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" indent="yes"/>

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

<xsl:template match="@*">
 <xsl:element name="{name()}" namespace="{namespace-uri()}">
  <_><xsl:value-of select="."/></_> 
 </xsl:element>
</xsl:template>

</xsl:stylesheet>

...ルートノードを...に変換します

<Invoice xmlns="urn:oasis:names:specification:ubl:schema:xsd:Invoice-2" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:cac="urn:oasis:names:specification:ubl:schema:xsd:CommonAggregateComponents-2" xmlns:cbc="urn:oasis:names:specification:ubl:schema:xsd:CommonBasicComponents-2" xmlns:sac="urn:oasis:names:specification:ubl:schema:xsd:SignatureAggregateComponents-2" xmlns:ext="urn:oasis:names:specification:ubl:schema:xsd:CommonExtensionComponents-2" xmlns:sig="urn:oasis:names:specification:ubl:schema:xsd:CommonSignatureComponents-2">
  <xsi:schemaLocation>
    <_ xmlns="">urn:oasis:names:specification:ubl:schema:xsd:Invoice-2 ../ws/Invoice.xsd</_>
  </xsi:schemaLocation>
于 2012-07-29T15:03:49.743 に答える
0

問題が何であるかについて完全に明確ではありませんが、存在する属性を持つ要素を一致させるために使用しているテンプレートに関係している可能性があると思います

<xsl:template match="*[@*]"> 
   <xsl:element name="{name()}"> 

特に、xsl:elementコマンドはまったく新しい要素を作成しますが、その新しい要素に対してどの名前空間を宣言する必要があるかについては何も言っていません。代わりにこれを試してください

<xsl:template match="*[@*]"> 
    <xsl:copy> 

これにより、名前空間の宣言 (ただしその属性) と共に請求書のコピーが作成されます。

于 2012-07-29T08:23:53.907 に答える