【问题标题】:Move a block from another add a node as attribute and remove the block从另一个移动块添加节点作为属性并删除块
【发布时间】:2017-11-26 19:08:14
【问题描述】:

我需要通过删除或处理一个块来将这个 XMl 转换为另一个,同时按照所需的输出格式化这个块,我一直不知道如何进行这种格式化

<?xml version="1.0" encoding="ISO-8859-1" ?> 
<output>
    <cars>
        <car>
          <id>1</id>
          <brand>Audi</brand>
          <type>A3</type>
          <license>B-01-TST</license>
        </car>
        <car>
          <id>2</id>
          <brand>Volkwagen</brand>
          <type>Golf</type>
          <license>IF-02-TST</license>
        </car>
    </cars>
    <distances>
        <distance>
          <id_car>1</id_car>
          <date>20110901</date>
          <distance>111</distance>
        </distance>
        <distance>
          <id_car>1</id_car>
          <date>20110902</date>
          <distance>23</distance>
        </distance>
        <id_car>2</id_car>
          <date>20110901</date>
          <distance>92</distance>
        </distance>
        <distance>
          <id_car>2</id_car>
          <date>20110902</date>
          <distance>87</distance>
        </distance>
    </distances>
</output>

进入这个输出:

<?xml version="1.0" encoding="ISO-8859-1" ?> 
<output>
<cars>
<car>
  <id>1</id>
  <brand>Audi</brand>
  <type>A3</type>
  <license>B-01-TST</license>
  <distances>
    <distance day="20110901">111</distance>
    <distance day="20110902">23</distance>
  </distances>
</car>
<car>
  <id>2</id>
  <brand>Volkwagen</brand>
  <type>Golf</type>
  <license>IF-02-TST</license>
  <distances>
    <distance day="20110901">92</distance>
    <distance day="20110902">87</distance>
  </distances>
</car>
</cars>
</output>

到目前为止,我只能删除距离块并将其添加到正确的位置,但是如何获取按 car/id 组织的距离并将日期标签作为属性日添加到距离中? 这是我到目前为止所做的:

<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output indent="yes"/>
<xsl:strip-space elements="*"/>

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

<xsl:template match="distances" />

<xsl:template match="license">
    <xsl:copy-of select="."/>
    <distances></distances> 
</xsl:template>

</xsl:stylesheet>

【问题讨论】:

    标签: xslt xslt-1.0 xslt-2.0 xsl-fo


    【解决方案1】:

    使用一个键跟随交叉引用,然后编写一个模板来转换那些引用的元素:

    <?xml version="1.0" encoding="UTF-8" ?>
    <xsl:transform xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0">
    
        <xsl:strip-space elements="*"/>
        <xsl:output indent="yes"/>
    
        <xsl:key name="dist" match="distances/distance" use="id_car"/>
    
        <xsl:template match="@*|node()">
            <xsl:copy>
                <xsl:apply-templates select="@*|node()"/>
            </xsl:copy>
        </xsl:template>
    
        <xsl:template match="distances" />
    
        <xsl:template match="license">
            <xsl:next-match/>
            <distances>
                <xsl:apply-templates select="key('dist', ../id)"/>
            </distances> 
        </xsl:template>
    
        <xsl:template match="distance">
            <distance day="{date}">
                <xsl:value-of select="distance"/>
            </distance>
        </xsl:template>
    
    </xsl:transform>
    

    http://xsltransform.net/a9GixV

    【讨论】:

    • 谢谢伙计,它正在工作!我只是不明白 select="key('dist', ../id)" 部分,这意味着您正在使用 id_car 并匹配到 cars/car/id 的密钥 dist ?
    • 你用过钥匙吗?键声明&lt;xsl:key name="dist" match="distances/distance" use="id_car"/&gt;“要求”XSLT 处理器通过id_car 值索引distances 元素的distance 子元素,然后我们可以使用key 函数通过这样的方法找到distance价值。在license 模板中,我们要使用的id 是父car 的一部分,我们需要调用key('dist', ../id)
    • 我刚学XSL,以前没用过key,还是很有帮助的,谢谢大佬!
    猜你喜欢
    • 1970-01-01
    • 2017-09-20
    • 2016-10-11
    • 2021-06-24
    • 1970-01-01
    • 1970-01-01
    • 2018-01-03
    • 2021-11-24
    • 1970-01-01
    相关资源
    最近更新 更多