0

在我看来,这是非常简单的东西,但我无法弄清楚如何使用 XPath 选择以下格式的节点:

<w:p>
            <w:pPr />
            <w:customXml w:uri="DxDitaOXmlPub" w:element="msgnum">
              <w:r>
                <w:rPr>
                  <w:rStyle w:val="Dxmsgnum" />
                </w:rPr>
                <w:t>Consult your compliance officer.</w:t>
              </w:r>
            </w:customXml>
          </w:p>

我尝试了以下样式表的多种变体:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"
xmlns:a="http://schemas.openxmlformats.org/drawingml/2006/main" 
xmlns:pic="http://schemas.openxmlformats.org/drawingml/2006/picture" 
xmlns:wpc="http://schemas.microsoft.com/office/word/2010/wordprocessingCanvas" 
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
xmlns:o="urn:schemas-microsoft-com:office:office" 
xmlns:r="http://schemas.openxmlformats.org/officeDocument/2006/relationships" 
xmlns:m="http://schemas.openxmlformats.org/officeDocument/2006/math" 
xmlns:v="urn:schemas-microsoft-com:vml" 
xmlns:wp14="http://schemas.microsoft.com/office/word/2010/wordprocessingDrawing" 
xmlns:wp="http://schemas.openxmlformats.org/drawingml/2006/wordprocessingDrawing" 
xmlns:w10="urn:schemas-microsoft-com:office:word" 
xmlns:w="http://schemas.openxmlformats.org/wordprocessingml/2006/main" 
xmlns:w14="http://schemas.microsoft.com/office/word/2010/wordml" 
xmlns:wpg="http://schemas.microsoft.com/office/word/2010/wordprocessingGroup" 
xmlns:wpi="http://schemas.microsoft.com/office/word/2010/wordprocessingInk" 
xmlns:wne="http://schemas.microsoft.com/office/word/2006/wordml" 
xmlns:wps="http://schemas.microsoft.com/office/word/2010/wordprocessingShape">

<!-- Identity Transform -->

<xsl:template match="/ | @* | node()" name="identity">
    <xsl:copy>
        <xsl:apply-templates select="@* | node() "/>
    </xsl:copy>
</xsl:template>

<xsl:template match="w:p[descendant::w:rPr/w:rStyle/@w:val='msgnum']">

    <w:p>
        <w:pPr>
            <w:pStyle w:val="ActionRequired" />
        </w:pPr>
        <w:customXml w:uri="DxDitaOXmlPub" w:element="Dxmsgnum">
            <w:r>
                <w:rPr>
                    <w:rStyle w:val="Dxmsgnum" />
                </w:rPr>
                <w:t>
                    <xsl:value-of select="descendant::w:t"/>
                </w:t>
            </w:r>
        </w:customXml>
    </w:p>

</xsl:template>

</xsl:stylesheet>

想要的结果真的没什么花哨的,只是修改w:pPr元素以包含一个非空的 child w:pStyle

 <w:p>
            <w:pPr>
                <w:pStyle w:val="ActionRequired" />
            </w:pPr>
            <w:customXml w:uri="DxDitaOXmlPub" w:element="Dxmsgnum">
                <w:r>
                    <w:rPr>
                        <w:rStyle w:val="Dxmsgnum" />
                    </w:rPr>
                    <w:t>
                        Consult your compliance officer.
                    </w:t>
                </w:r>
            </w:customXml>
        </w:p>

我看不出样式表没有按原样执行我想要的任何原因,但我对 OpenXML 格式并不熟悉,所以也许有一些我不知道的时髦的东西?

编辑:我也尝试过@w:element如下匹配:

<xsl:template match="w:p[child::w:customXml/@w:element='msgnum']">

        <w:p>
            <w:pPr>
                <w:pStyle w:val="ActionRequired" />
            </w:pPr>
            <w:customXml w:uri="DxDitaOXmlPub" w:element="msgnum">
                <w:r>
                    <w:rPr>
                        <w:rStyle w:val="Dxmsgnum" />
                    </w:rPr>
                    <w:t>
                        <xsl:value-of select="descendant::w:t"/>OOGA BOOGA!
                    </w:t>
                </w:r>
            </w:customXml>
        </w:p>

</xsl:template>
4

1 回答 1

0

试试这样的东西吗?正常复制节点,除了将所需的子元素插入到作为 aw:p 元素的子元素的空 w:pPr 元素中。

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0" xmlns:w="http://schemas.openxmlformats.org/wordprocessingml/2006/main" >

    <!-- Identity Transform -->

    <xsl:template match="/ | @* | node()" name="identity">
        <xsl:copy>
            <xsl:apply-templates select="@* | node() "/>
        </xsl:copy>
    </xsl:template>

    <xsl:template match="w:pPr[parent::w:p//@* = 'msgnum']">
        <xsl:copy>
            <w:pStyle w:val="ActionRequired" />
        </xsl:copy>
    </xsl:template>

</xsl:stylesheet>

编辑:你能澄清什么是可接受的支票吗?任何包含属性等于“msgnum”的元素?我修复了模板匹配以反映这种情况。

于 2012-08-21T17:56:54.070 回答