首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用xmlstaret、grep或类似的方法更新xsl文件

用xmlstaret、grep或类似的方法更新xsl文件
EN

Stack Overflow用户
提问于 2021-12-06 11:28:48
回答 2查看 72关注 0票数 0

我有一系列类似的XSL文件,在所有这些文件中,我必须在特定位置添加相同的XSL元素。

在这里,您可以找到要更新的XSL的一部分,要插入的元素是<xsl:call-template name="distributor.xsl"/>,它必须在</mrd:distributionFormat>之后和<mrd:transferOptions>标记之前。

是否有一种方法可以使用XmlStarlet、grep或类似的方式将此更新自动化到我的所有XSL文件?

代码语言:javascript
复制
...
<mdb:distributionInfo>
      <mrd:MD_Distribution>
         <mrd:distributionFormat>
            <mrd:MD_Format>
               <mrd:formatSpecificationCitation>
                  <cit:CI_Citation>
                     <cit:title>
                        <gco:CharacterString>WCS</gco:CharacterString>
                     </cit:title>
                     <cit:date gco:nilReason="unknown"/>
                     <cit:edition>
                        <gco:CharacterString>2.0</gco:CharacterString>
                     </cit:edition>
                  </cit:CI_Citation>
               </mrd:formatSpecificationCitation>
            </mrd:MD_Format>
         </mrd:distributionFormat>
                 <!-- call-template  -->           
                <xsl:call-template name="distributor.xsl"/>
                 <!-- call-template -->
         <mrd:transferOptions>
         ...

我试过

xmlstarlet ed -P -S -L -s //mrd:MD_Distribution -t elem -i xsl:include -t attr -n "name" -v "distributor.xsl" main.xsl,其中main.xsl是要更新的文件

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2022-01-21 11:39:49

需求变更后

在逗号之后插入您想要的xsl:call-template节点(有关详细信息,请参阅我的第一篇文章),

代码语言:javascript
复制
xmlstarlet edit \
    -i '//mrd:transferOptions[1]' \
    -t elem -n 'xsl:call-template' -v '' \
    -s '$prev' -t attr -n name -v 'distributor.xsl' \
main.xsl

在以下XML文件上运行时(根据需要调整名称空间):

代码语言:javascript
复制
<xsl:transform version="1.0"
  xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
  xmlns:cit="urn:so70244776_cit"
  xmlns:gco="urn:so70244776_gco"
  xmlns:mdb="urn:so70244776_mdb"
  xmlns:mrd="urn:so70244776_mrd"
>
  <xsl:template name="x">
    <mdb:distributionInfo>
        <mrd:MD_Distribution>
           <mrd:distributionFormat>
              <mrd:MD_Format>
                 <mrd:formatSpecificationCitation>
                    <cit:CI_Citation>
                       <cit:title>
                          <gco:CharacterString>WCS</gco:CharacterString>
                       </cit:title>
                       <cit:date gco:nilReason="unknown"/>
                       <cit:edition>
                          <gco:CharacterString>2.0</gco:CharacterString>
                       </cit:edition>
                    </cit:CI_Citation>
                 </mrd:formatSpecificationCitation>
              </mrd:MD_Format>
           </mrd:distributionFormat>
           <mrd:transferOptions/>
        </mrd:MD_Distribution>
    </mdb:distributionInfo>
  </xsl:template>

</xsl:transform>
票数 1
EN

Stack Overflow用户

发布于 2021-12-07 00:18:39

在POSIX中,下面的小星命令:

代码语言:javascript
复制
xmlstarlet edit \
    -N xsl="http://www.w3.org/1999/XSL/Transform" \
    -N mdb="urn:so70244776_mdb" \
    -N mrd="urn:so70244776_mrd" \
    --var templatename "'distributor-N.xsl'" \
    --var anchornode '//mrd:distributionFormat[1]' \
    -d '$anchornode/following-sibling::xsl:call-template' \
    -a '$anchornode' -t elem -n 'xsl:call-template' -v '' \
    -a '$xstar:prev' -t attr -n name -v '' \
    -u '$xstar:prev' -x '$templatename' \
main.xsl
  • 声明许多命名空间绑定。
  • 选择//mrd:distributionFormat[1]作为锚节点
  • 删除锚后的任何现有xsl:call-template同级节点。
  • 用一个xsl:call-template属性追加一个新的name元素

xmlstarlet edit代码可以使用方便$xstar:prev (又名$prev)节点来引用最近的-i / --insert-a / --append-s / --subnode选项创建的节点。$xstar:prev的例子在doc/xmlstarlet.txt和源代码的示例/ Examples *中给出。在所示的命令中,它的第一个用法引用xsl:call-template元素,第二个引用name属性。

编辑:事实证明,xmlstarlet edit并不像我想象的那样挑剔,而是一种更短的命令(属性节点可以用-s-i-a添加):

代码语言:javascript
复制
xmlstarlet edit \
    --var anchor '//mrd:distributionFormat[1]' \
    -d '$anchor/following-sibling::xsl:call-template' \
    -a '$anchor' -t elem -n 'xsl:call-template' -v '' \
    -s '$prev' -t attr -n name -v 'distributor-N.xsl' \
main.xsl

给定以下(演示)输入:

代码语言:javascript
复制
<?xml version="1.0" encoding="UTF-8"?>
<xsl:transform version="1.0"
  xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
  xmlns:mdb="urn:so70244776_mdb"
  xmlns:mrd="urn:so70244776_mrd"
>
   <xsl:template name="q">
      <mdb:distributionInfo>
         <mrd:MD_Distribution>
            <mrd:distributionFormat>
               <mrd:MD_Format>
                  <mrd:formatSpecificationCitation/>
               </mrd:MD_Format>
            </mrd:distributionFormat>
            <xsl:call-template name="distributor.xsl"/>
            <!-- x -->
            <xsl:call-template name="distributor-1.xsl"/>
            <mrd:transferOptions/>
         </mrd:MD_Distribution>
      </mdb:distributionInfo>
   </xsl:template>
</xsl:transform>

上面的任何一个命令都会产生以下输出:

代码语言:javascript
复制
<?xml version="1.0" encoding="UTF-8"?>
<xsl:transform xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:mdb="urn:so70244776_mdb" xmlns:mrd="urn:so70244776_mrd" version="1.0">
  <xsl:template name="q">
    <mdb:distributionInfo>
      <mrd:MD_Distribution>
        <mrd:distributionFormat>
          <mrd:MD_Format>
            <mrd:formatSpecificationCitation/>
          </mrd:MD_Format>
        </mrd:distributionFormat>
        <xsl:call-template name="distributor-N.xsl"/>
        <!-- x -->
        <mrd:transferOptions/>
      </mrd:MD_Distribution>
    </mdb:distributionInfo>
  </xsl:template>
</xsl:transform>
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70244776

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档