XSLT - 匹配多个条件(和)

XSLT - match with multiple condition (and)

我有以下输入

<?xml version="1.0" encoding="UTF-8"?>
<document>
   <body>
        <p>
         <pPr>
            <spacing after="120"/>
            <ind left="357"/>
         </pPr>
         <r>
            <t>Should stay same</t>
         </r>
      </p>
      <p>
         <pPr>
            <pStyle val="ListeAufzhlung"/>
            <spacing after="120"/>
         </pPr>
         <r>
            <t>Liste.Aufzählung</t>
         </r>
      </p>
      <p>
         <pPr>
            <spacing after="120"/>
            <ind left="357"/>
         </pPr>
         <r>
            <t>Shouldl change ind to pStyle</t>
         </r>
      </p>
      <p>
         <pPr>
            <pStyle val="ListeAufzhlung2"/>
            <spacing after="120"/>
         </pPr>
         <r>
            <t>Liste.Aufzählung 2</t>
         </r>
      </p>
   </body>
</document>

我想要的结果:

<?xml version="1.0" encoding="UTF-8"?>
<document>
   <body>
      <p>
         <pPr>
            <spacing after="120"/>
            <ind left="357"/>
         </pPr>
         <r>
            <t>Should stay same</t>
         </r>
      </p>
      <p>
         <pPr>
            <pStyle val="ListeAufzhlung"/>
            <spacing after="120"/>
         </pPr>
         <r>
            <t>Liste.Aufzählung</t>
         </r>
      </p>
      <p>
         <pPr>
            <spacing after="120"/>
            <pStyle val="ListeAufzhlung"/>
         </pPr>
         <r>
            <t>Shouldl change ind to pStyle</t>
         </r>
      </p>
      <p>
         <pPr>
            <pStyle val="ListeAufzhlung2"/>
            <spacing after="120"/>
         </pPr>
         <r>
            <t>Liste.Aufzählung 2</t>
         </r>
      </p>
   </body>
</document>

逻辑:

如果在先前的 p 节点中有一个 ind-tag 并且 pStyle 具有 val“ListeAufzhlung”,则将 ind 标签更改为 <pStyle val="ListeAufzhlung"/>。 val 也可以不同。因此,如果条件为真,则将当前 ind-tag 替换为先前 p-tag 中的 pStyle-tag。

到目前为止我的 xslt:

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

<xsl:strip-space elements="*"/>
<xsl:preserve-space elements="t"/>
<xsl:output method="xml" encoding="UTF-8" indent="yes" omit-xml-declaration="no"/>

       
    <xsl:template match="@* | node()">
        <xsl:copy>
            <xsl:apply-templates select="@*, node()"/>
        </xsl:copy>
    </xsl:template>
    
    <xsl:template match="ind[@left]">
        
    </xsl:template>
</xsl:stylesheet>

以下无效:

<xsl:template match="ind[@left] and ../../p/pPr/pStyle[@val="ListeAufzhlung"]">

有人对此有好的解决方案吗?

我想你可以检查一下

<xsl:template match="p[pPr/ind[@left]][preceding-sibling::*[1][self::p[pPr/pStyle/@val = 'ListeAufzhlung']]]/pPr/ind">
  <pStyle val="ListeAufzhlung"/>
</xsl:template>

<xsl:template match="p[pPr/ind[@left]][preceding-sibling::*[1][self::p[pPr/pStyle/@val]]]/pPr/ind">
  <xsl:copy-of select="ancestor::p/preceding-sibling::*[1]/pPr/pStyle[@val]"/>
</xsl:template>

对于更一般的情况。