我有一系列类似的XSL文件,在所有这些文件中,我必须在特定位置添加相同的XSL元素。
在这里,您可以找到要更新的XSL的一部分,要插入的元素是<xsl:call-template name="distributor.xsl"/>,它必须在</mrd:distributionFormat>之后和<mrd:transferOptions>标记之前。
是否有一种方法可以使用XmlStarlet、grep或类似的方式将此更新自动化到我的所有XSL文件?
...
<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是要更新的文件
发布于 2022-01-21 11:39:49
需求变更后
在逗号之后插入您想要的xsl:call-template节点(有关详细信息,请参阅我的第一篇文章),
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文件上运行时(根据需要调整名称空间):
<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>发布于 2021-12-07 00:18:39
在POSIX中,下面的小星命令:
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添加):
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给定以下(演示)输入:
<?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>上面的任何一个命令都会产生以下输出:
<?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>https://stackoverflow.com/questions/70244776
复制相似问题