Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/xslt/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Xslt 重命名前缀而不干扰属性的XSL代码_Xslt_Sap - Fatal编程技术网

Xslt 重命名前缀而不干扰属性的XSL代码

Xslt 重命名前缀而不干扰属性的XSL代码,xslt,sap,Xslt,Sap,下面我给出了我尝试过的XSL代码以及部分输入和输出代码。如果我使用XSL1重命名xml标记中的名称空间前缀值,不幸的是,它会折叠属性值,如果我使用XSL2,则会创建一个单独的节点。有人能帮我写一个XSL来重命名前缀,但把属性保持在同一个节点上吗 XSL 1:​ <xsl:output method="xml" encoding="UTF-8" indent="yes"/> <xsl:strip-space elements="*"/> <xsl:template m

下面我给出了我尝试过的XSL代码以及部分输入和输出代码。如果我使用XSL1重命名xml标记中的名称空间前缀值,不幸的是,它会折叠属性值,如果我使用XSL2,则会创建一个单独的节点。有人能帮我写一个XSL来重命名前缀,但把属性保持在同一个节点上吗

XSL 1:​

<xsl:output method="xml" encoding="UTF-8" indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:template match="/">
<xsl:copy>
<xsl:apply-templates select="@* | node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="ns0:*">
<xsl:element name="ubl:{local-name()}" namespace="urn:oasis:names:specification:ubl:schema:xsd:Invoice-2">
<xsl:apply-templates select="@* | node()"/>
</xsl:element>
</xsl:template>

XSL2:


输入:

<ns5:LegalMonetaryTotal>
  <ns2:LineExtensionAmount currencyID="EUR">35.38</ns2:LineExtensionAmount>
  <ns2:TaxExclusiveAmount currencyID="EUR">35.38</ns2:TaxExclusiveAmount>
  <ns2:TaxInclusiveAmount currencyID="EUR">37.5</ns2:TaxInclusiveAmount>
  <ns2:PrepaidAmount currencyID="EUR">37.5</ns2:PrepaidAmount>
  <ns2:PayableAmount currencyID="EUR">0.00</ns2:PayableAmount>
</ns5:LegalMonetaryTotal>

35.38
35.38
37.5
37.5
0
产出1:

<cac:LegalMonetaryTotal >
  <cbc:LineExtensionAmount >EUR35.38</cbc:LineExtensionAmount>
  <cbc:TaxExclusiveAmount >EUR35.38</cbc:TaxExclusiveAmount>
  <cbc:TaxInclusiveAmount >EUR37.5</cbc:TaxInclusiveAmount>
  <cbc:PrepaidAmount >EUR37.5</cbc:PrepaidAmount>
  <cbc:PayableAmount >EUR0.00</cbc:PayableAmount>
</cac:LegalMonetaryTotal>

35.38欧元
35.38欧元
37.5欧元
37.5欧元
0.00欧元
输出2:

<cac:LegalMonetaryTotal >
  <cbc:LineExtensionAmount >
    <currencyID>EUR</currencyID>
    35.38
  </cbc:LineExtensionAmount>
  <cbc:TaxExclusiveAmount >
    <currencyID>EUR</currencyID>
    35.38
  </cbc:TaxExclusiveAmount>
  <cbc:TaxInclusiveAmount >
    <currencyID>EUR</currencyID>
    37.5
  </cbc:TaxInclusiveAmount>
  <cbc:PrepaidAmount >
    <currencyID>EUR</currencyID>
    37.5
  </cbc:PrepaidAmount>
  <cbc:PayableAmount>
    <currencyID>EUR</currencyID>
    0.00
  </cbc:PayableAmount>
</cac:LegalMonetaryTotal>

欧元
35.38
欧元
35.38
欧元
37.5
欧元
37.5
欧元
0
但预期的结果是:我尝试了多种选择。请帮我获取以下格式

<cbc:LegalMonetaryTotal>
  <cac:LineExtensionAmount currencyID="EUR">35.38</cac:LineExtensionAmount>
  <cac:TaxExclusiveAmount currencyID="EUR">35.38</cac:TaxExclusiveAmount>
  <cac:TaxInclusiveAmount currencyID="EUR">37.5</cac:TaxInclusiveAmount>
  <cac:PrepaidAmount currencyID="EUR">37.5</cac:PrepaidAmount>
  <cac:PayableAmount currencyID="EUR">0.00</cac:PayableAmount>
</cbc:LegalMonetaryTotal>

35.38
35.38
37.5
37.5
0
问候,


Indu

第一个样式表没有输出任何属性的原因是您没有处理属性的模板。因此,指示:

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

不为属性执行任何操作

尝试更改第一个模板:

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

到标准模板:

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

这可能会使它起作用。我说可能,因为您的样式表既不适合您的输入,也不适合预期的输出。您的样式表将查找:

<xsl:template match="ns0:*">


但是您的输入没有前缀为
ns0
的元素。样式表输出一个
ubl
前缀,而预期的输出使用
cbc
cac
前缀。并且-正如您问题的评论中已经提到的-所有这些前缀都需要绑定到名称空间,以便输入和输入是格式良好的XML文档。

请显示最小但完整的示例,在不显示确切的名称空间声明的情况下谈论与名称空间相关的问题是毫无意义的。除了Martin comment,如果输入
ns5
和预期的
cbc
前缀都指向相同的名称空间(以及
ns2/cac
的相同注释),则大致如此,那么这两个输入和预期的XML是相同的。不需要重命名前缀,任何XML软件都会解释与前缀对应的名称空间,而不是前缀本身。嗨,Michael,是的,我应该添加完整的代码片段让您了解。我已经使用了下面的代码片段,并对所有名称空间前缀ns0、ns1、ns2、ns3、ns4、ns5重复了这些代码。请不要在评论中发布代码-它不可读。编辑您的问题或发布新问题。