使用XSLT多次更新同一节点

吉米·詹姆斯(Jimmy James)

我正在尝试使用XSLT更新我拥有的XML文档。它需要对文档进行多项更改以将其转换为其他一些规范。

我想做的是多次更新同一节点。另一种查看方式是,我想在文档上进行多次传递,并且每次传递都可以更新同一节点。

我所有的谷歌搜索提示都使用xsl:template的'mode'属性,但是所有'mode'属性的示例都涉及两次输出节点-就像在目录中使用标题并使用它的情况一样再次作为章节标题。我不想输出两次节点,我想更新两次。

我的样本XSLT:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version = '2.0'
     xmlns:xsl='http://www.w3.org/1999/XSL/Transform'>

  <!-- identity transform (copy over the document) -->
  <xsl:template match="@*|node()">
    <xsl:copy>
      <xsl:apply-templates select="@*|node()" />
    </xsl:copy>
  </xsl:template>

  <!-- wrap all BBB nodes in parenthesis -->
  <xsl:template match="BBB" >
    <xsl:copy>
        (<xsl:apply-templates select="@*|node()" />)
    </xsl:copy>
  </xsl:template>

  <!-- any BBB that has a CCC should get an attribute indicating so -->
  <xsl:template match="BBB[CCC]">
    <xsl:copy>
        <xsl:attribute name="hasC">true</xsl:attribute>
        <xsl:apply-templates select="@*|node()" />
    </xsl:copy>
  </xsl:template>


</xsl:stylesheet> 

我的示例xml文档:

<?xml version="1.0" encoding="UTF-8"?>
<source>

<AAA>
     <BBB>Bee bee bee</BBB>
     <BBB>Bee two bee two bee two</BBB>
</AAA>
<AAA>
     <BBB/>
     <CCC>
          <DDD/>
     </CCC>
     <BBB>
          <CCC/>
     </BBB>
</AAA>

</source> 

当前输出:

<?xml version="1.0" encoding="UTF-8"?><source>

<AAA>
     <BBB>
        (Bee bee bee)
    </BBB>
     <BBB>
        (Bee two bee two bee two)
    </BBB>
</AAA>
<AAA>
     <BBB>
        ()
    </BBB>
     <CCC>
          <DDD/>
     </CCC>
     <BBB hasC="true">
          <CCC/>
     </BBB>
</AAA>

</source>

如您所见,具有“ CCC”的BBB节点仅使用第二个模板进行了一次更新-第一个模板未对其进行修改。理想情况下,我希望输出为

<BBB hasC="true">
  (<CCC/>)
</BBB>

这可能吗?我知道我可以通过将两个模板组合在一起来实现此目的,但是我真的想将它们分开以保持可读性和可维护性-两个模板来自不同的要求,并且将它们分开是理想的。

我想我可以有两个XSLT文件,并通过两次调用XSLT处理器将它们链接在一起,但是我希望我不需要这样做。

编辑:基于很多评论,我认为我误解了有关XSLT和转换的一些基本知识。

我的问题是:我有一堆符合规范的XML文档。另一个人对此规范进行了更新,因此我需要创建一个批处理/可编写脚本的过程,以便能够更新大量这些XML文档,以便它们与该新规范匹配。

其中一些新更新如下所示。

1)<string lang="FR">hello</string>需要更改为<string lang="fra">hello</string>

2)<a><b><string>Color</string><b></a>需要更改为<a><b><string>Colour</string></b></a>,但请勿触摸<a><c><string>Color</string></c></a>

3)所有<orgName><string>***anytext***</string></orgName>需要更改为<orgName><string>My Company: ***anytext***</string></orgName>

4)所有<orgName><string></string></orgName>节点都需要更改为<organisationName><string></string></orgisationName>

等等。有很多特定的更新可以多次应用于相同的节点,并且这些更新足够多,因此对文件进行多次传递似乎是一个更好的主意,然后创建一个包罗万象的模板,将所有这些更新合并为一个大模板。

我应该使用XSLT尝试执行此操作吗?我是否需要将这些更改分解为多个文件并将它们链接到脚本中?我可以在单个.xslt文件中进行所有这些更新吗?

matthias_h

就像您更新的示例输入的示例一样:XSLT之后

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0">
 <xsl:output method="xml" doctype-public="XSLT-compat" 
      encoding="UTF-8" indent="yes" />
 <xsl:strip-space elements="*" />
  <!-- identity transform (copy over the document) -->
  <xsl:template match="@*|node()">
    <xsl:copy>
      <xsl:apply-templates select="@*|node()" />
    </xsl:copy>
  </xsl:template>
  <!-- wrap all BBB nodes in parenthesis -->
  <xsl:template match="BBB">
    <xsl:copy>
       <xsl:if test="CCC">
          <xsl:attribute name="hasC">true</xsl:attribute>
       </xsl:if>
       (<xsl:apply-templates select="@*|node()" />)
    </xsl:copy>
  </xsl:template>
  <xsl:template match="orgName[string]">
    <organisationName>
      <xsl:apply-templates />
    </organisationName>
  </xsl:template>
  <xsl:template match="a/b/string[text()='Color']">
    <xsl:text>Colour</xsl:text>
  </xsl:template>
  <xsl:template match="orgName/string/text()">
    <xsl:text>Company:</xsl:text>
    <xsl:value-of select="." />
  </xsl:template>
  <xsl:template match="string[@lang='FR']">
    <xsl:copy>
      <xsl:attribute name="lang">fra</xsl:attribute>
      <xsl:apply-templates />
    </xsl:copy>
  </xsl:template>
</xsl:stylesheet>

当应用于示例输入XML时

<?xml version="1.0" encoding="UTF-8"?>
<source>
<AAA>
  <BBB>Bee bee bee</BBB>
  <BBB>Bee two bee two bee two</BBB>
    <test>
      <string lang="FR">hello</string>
    </test>
    <a>
       <b>
         <string>Color</string>
       </b>
    </a>
    <a>
       <c>
         <string>Color</string>
       </c>
    </a>
    <orgName>
       <string>***anytext***</string>
    </orgName>
    <orgName>
       <notstring>***anytext***</notstring>
    </orgName>
  </AAA>
  <AAA>
      <BBB />
      <CCC>
        <DDD />
      </CCC>
    <BBB>
      <CCC />
    </BBB>
  </AAA>
</source>

产生以下输出:

<?xml version="1.0" encoding="UTF-8"?>
<source>
  <AAA>
    <BBB>(Bee bee bee)</BBB>
    <BBB>(Bee two bee two bee two)</BBB>
    <test>
      <string lang="fra">hello</string>
    </test>
    <a>
      <b>Colour</b>
    </a>
    <a>
      <c>
        <string>Color</string>
      </c>
    </a>
    <organisationName>
      <string>Company:***anytext***</string>
    </organisationName>
    <orgName>
     <notstring>***anytext***</notstring>
  </orgName>
  </AAA>
  <AAA>
    <BBB>()</BBB>
    <CCC>
      <DDD />
    </CCC>
    <BBB hasC="true">
     (<CCC />)
    </BBB>
  </AAA>
</source>

您已经提到,更新中添加的4个要求仅是应应用于输入XML的许多更改列表的示例,因此这仅是如何处理同一节点上的各种更改的示例-例如:

<xsl:template match="orgName[string]">

匹配orgName包含一个节点的节点string经过

<organisationName>
  <xsl:apply-templates />
</organisationName>

此模板重命名orgNameorganisationName

第二模板相匹配的text()一个的string在一个节点orgName的节点:

<xsl:template match="orgName/string/text()">

Company:在此文本前面添加

<xsl:text>Company:</xsl:text>
  <xsl:value-of select="." />

两个模板的结果:

<organisationName>
   <string>Company:***anytext***</string>
</organisationName>

来自示例输入的orgName

<orgName><notstring>***anytext***</notstring></orgName>

以及文本保持不变(orgName不包含)string

我还删除了与模板匹配BBB[CCC]的设置hasC属性。相反,我添加了

<xsl:if test="CCC">
  <xsl:attribute name="hasC">true</xsl:attribute>
</xsl:if>

到模板匹配BBB

我不建议使用XSLT来应用所有必需的更改,因为我不知道必须应用所有特定的更改-它实际上取决于所需更改的输入和完整规范。我只是想提供一个示例,说明如何使用单个XSLT处理您在问题中提到的更改。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

XSLT模板,用于使用NameSpace过滤xml的同一节点上的重复项

来自分类Dev

在SpriteKit中多次生成同一节点的最佳实践(Swift)

来自分类Dev

在SpriteKit中多次生成同一节点的最佳实践(Swift)

来自分类Dev

同一节点上的“ Mirror” rabbitmq队列

来自分类Dev

如何找到进入同一节点的分区?

来自分类Dev

如何使用表达式在XSLT 1.0中选择唯一节点?

来自分类Dev

使用Slurm在同一节点上同时运行多个作业

来自分类Dev

使用 keys() 时来自同一节点的重复属性

来自分类Dev

是否可以向同一节点多次发送同一消息?

来自分类Dev

如何在节点集中搜索并从同一节点集中删除节点

来自分类Dev

使用JPath,如何基于同一节点的另一个键值对返回值?

来自分类Dev

所有节点与同一节点有关系的搜索路径

来自分类Dev

如何只获得一条开始于同一节点的路径?

来自分类Dev

Kubernetes:如何配置要在同一节点上部署的一组Pod?

来自分类Dev

查找不会两次访问同一节点的密码路径

来自分类Dev

cytoscape.js-如何合并来自不同来源的同一节点的属性

来自分类Dev

在LinkedList中两次插入同一节点会触发无限循环

来自分类Dev

JCR SQL2比较同一节点上的属性

来自分类Dev

查找不会两次访问同一节点的密码路径

来自分类Dev

如何确保两个Pod在同一节点上?

来自分类Dev

如果先前在 Jenkins 中失败,则阻止构建在同一节点上运行

来自分类Dev

Firebase 如何处理从不同设备对同一节点所做的更改?

来自分类Dev

Kubernetes:AKS Ingress 仅与同一节点和子网上的 Pod 通信

来自分类Dev

如果是单节点群集,主节点和工作节点是否是同一节点?

来自分类Dev

不允许在kubernetes中的同一节点上使用同一应用程序的两个Pod

来自分类Dev

我可以在同一节点上拥有主节点和工作节点吗?

来自分类Dev

当事务中涉及的所有帐户都在同一节点上时要使用还是不使用CollectSignatureFlow?

来自分类Dev

在同一节点中的纱线NodeManager和ResourceManager

来自分类Dev

同一节点中的不同结构链表C

Related 相关文章

  1. 1

    XSLT模板,用于使用NameSpace过滤xml的同一节点上的重复项

  2. 2

    在SpriteKit中多次生成同一节点的最佳实践(Swift)

  3. 3

    在SpriteKit中多次生成同一节点的最佳实践(Swift)

  4. 4

    同一节点上的“ Mirror” rabbitmq队列

  5. 5

    如何找到进入同一节点的分区?

  6. 6

    如何使用表达式在XSLT 1.0中选择唯一节点?

  7. 7

    使用Slurm在同一节点上同时运行多个作业

  8. 8

    使用 keys() 时来自同一节点的重复属性

  9. 9

    是否可以向同一节点多次发送同一消息?

  10. 10

    如何在节点集中搜索并从同一节点集中删除节点

  11. 11

    使用JPath,如何基于同一节点的另一个键值对返回值?

  12. 12

    所有节点与同一节点有关系的搜索路径

  13. 13

    如何只获得一条开始于同一节点的路径?

  14. 14

    Kubernetes:如何配置要在同一节点上部署的一组Pod?

  15. 15

    查找不会两次访问同一节点的密码路径

  16. 16

    cytoscape.js-如何合并来自不同来源的同一节点的属性

  17. 17

    在LinkedList中两次插入同一节点会触发无限循环

  18. 18

    JCR SQL2比较同一节点上的属性

  19. 19

    查找不会两次访问同一节点的密码路径

  20. 20

    如何确保两个Pod在同一节点上?

  21. 21

    如果先前在 Jenkins 中失败,则阻止构建在同一节点上运行

  22. 22

    Firebase 如何处理从不同设备对同一节点所做的更改?

  23. 23

    Kubernetes:AKS Ingress 仅与同一节点和子网上的 Pod 通信

  24. 24

    如果是单节点群集,主节点和工作节点是否是同一节点?

  25. 25

    不允许在kubernetes中的同一节点上使用同一应用程序的两个Pod

  26. 26

    我可以在同一节点上拥有主节点和工作节点吗?

  27. 27

    当事务中涉及的所有帐户都在同一节点上时要使用还是不使用CollectSignatureFlow?

  28. 28

    在同一节点中的纱线NodeManager和ResourceManager

  29. 29

    同一节点中的不同结构链表C

热门标签

归档