【问题标题】:Copy xml attribute in XSLT在 XSLT 中复制 xml 属性
【发布时间】:2015-02-11 07:22:22
【问题描述】:

我想将属性值从输入复制到输出。

输入中的属性位置是:katz-request/request/statebond-buy/payment/amount/@curr

输出中属性的位置是:katz-reply/reply/statebond-buy/amount/@curr

这里是输入xml

<?xml version="1.0" encoding="ISO-8859-2" standalone="yes"?>
<katz-request>
   <request>
      <statebond-buy>
         <isin>PL0000108155</isin>
         <name>DOS0616</name>
         <count>2</count>
         <pay-date>2014-06-18</pay-date>
         <payment>
            <amount curr="PLN">200.00</amount>
         </payment>
      </statebond-buy>
   </request>
</katz-request>

这是我的转变

<?xml version="1.0" encoding="iso-8859-2" standalone="yes"?>
<xsl:transform xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
    <xsl:output method="xml" encoding="iso-8859-2" indent="yes" standalone="yes"/>
    <xsl:template match="/">
        <katz-reply>
            <reply>
                <statebond-buy>
                    <count>
                        <xsl:value-of select="katz-request/request/statebond-buy/count"/>
                    </count>
                    <amount curr="DEM">
                        <xsl:value-of select="katz-request/request/statebond-buy/payment/amount"/>
                    </amount>
                    <tx-id>843084</tx-id>
                    <day-ref-id>837</day-ref-id>
                    <appl-id>000000000002267</appl-id>
                </statebond-buy>
            </reply>
        </katz-reply>
    </xsl:template>
</xsl:transform>

这是结果

<?xml version="1.0" encoding="iso-8859-2" standalone="yes"?>
<katz-reply>
  <reply>
    <statebond-buy>
      <count>2</count>
      <amount curr="DEM">200.00</amount>
      <tx-id>843084</tx-id>
      <day-ref-id>837</day-ref-id>
      <appl-id>000000000002267</appl-id>
    </statebond-buy>
  </reply>
</katz-reply>

包含“DEM”而不是“PLN”。

【问题讨论】:

    标签: xml xslt copy


    【解决方案1】:

    您可以在这里使用“属性值模板”,并像这样写出您的 XML

            <amount curr="{katz-request/request/statebond-buy/payment/amount/@curr}">
                <xsl:value-of select="katz-request/request/statebond-buy/payment/amount"/>
            </amount>
    

    花括号表示要计算的表达式,而不是字面输出。

    但更好的是重写您的 XSLT 以使用 XSLT Identity Template,然后这只是跨整个节点复制的情况。

    试试这个 XSLT

    <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
        <xsl:output method="xml" encoding="iso-8859-2" indent="yes" standalone="yes"/>
    
        <xsl:template match="@*|node()">
            <xsl:copy>
                <xsl:apply-templates select="@*|node()"/>
            </xsl:copy>
        </xsl:template>
    
        <xsl:template match="statebond-buy">
            <statebond-buy>
                <xsl:apply-templates select="count" />
                <xsl:apply-templates select="payment/amount" />
                <tx-id>843084</tx-id>
                <day-ref-id>837</day-ref-id>
                <appl-id>000000000002267</appl-id>
            </statebond-buy>
        </xsl:template>
    </xsl:stylesheet>
    

    【讨论】:

    • 两者都很好用!其次需要多一点思考才能理解。非常感谢。
    • 身份转换是 XSLT 中常见的设计模式,因此值得了解。实际上,这意味着您只需为要转换的节点编写模板。在您的情况下,您实际上只是在转换 statebond-buy 元素(因为您需要向它添加新的子节点)。
    【解决方案2】:

    来个简单的怎么样:

    <xsl:stylesheet version="1.0" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="xml" version="1.0" encoding="iso-8859-2" indent="yes"/>
    
    <xsl:template match="/">
        <katz-reply>
            <reply>
                <xsl:for-each select="katz-request/request/statebond-buy">
                    <statebond-buy>
                        <xsl:copy-of select="count | payment/amount"/>
                        <tx-id>843084</tx-id>
                        <day-ref-id>837</day-ref-id>
                        <appl-id>000000000002267</appl-id>
                    </statebond-buy>
                </xsl:for-each>             
            </reply>
        </katz-reply>
    </xsl:template>
    
    </xsl:stylesheet>
    

    【讨论】:

    • 工作出色且相当简单。
    猜你喜欢
    • 2022-01-26
    • 1970-01-01
    • 1970-01-01
    • 2018-11-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-31
    • 1970-01-01
    相关资源
    最近更新 更多