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>
对于更一般的情况。
我有以下输入
<?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>
对于更一般的情况。