比较处理指令并获取文件名

时间:2016-03-10 08:17:10

标签: xslt xslt-2.0

我正在编写一个XSLT,我需要查看一个值是否在预处理指令中。在我的XML中,预处理如下所示。

 <?xpp MAIN;1;1;0;0;69;0;0?>

示例XML

<root>
    <?xpp MAIN;1;0;0;0;73;0;0?>
    <preface role="guideline">
        <title>title</title>
        <section role="group">
            <para>data</para>
        </section>
        <section role="group">
            <title>
                <?xpp lp;0.5p?>Licences</title>
            <itemizedlist mark="bullet">
                <listitem>
                    <para>itemdata</para>
                </listitem>
            </itemizedlist>
        </section>
        <section role="group">
            <title>
                <?xpp lp;0.5p?>Letters to the Editor</title>
            <itemizedlist mark="bullet">
                <listitem>
                    <para><?xpp MAIN;1;0;0;0;74;0;0?>item data</para>
                </listitem>
            </itemizedlist>
        </section>
    </preface>
</root>

Sample1 XML

<root>
    <?xpp MAIN;1;0;0;0;83;0;0?>
    <preface role="guideline">
        <title>title</title>
        <section role="group">
            <para>data</para>
        </section>
        <section role="group">
            <title>
                <?xpp lp;0.5p?>Licences</title>
            <itemizedlist mark="bullet">
                <listitem>
                    <para>itemdata</para>
                </listitem>
            </itemizedlist>
        </section>
        <section role="group">
            <title>
                <?xpp lp;0.5p?>Letters to the Editor</title>
            <itemizedlist mark="bullet">
                <listitem>
                    <para><?xpp MAIN;1;0;0;0;84;0;0?>item data</para>
                </listitem>
            </itemizedlist>
        </section>
    </preface>
</root>

对于以下XML,我需要执行遍历文件和检查数据的任务。上面的示例XML和Sample1 XML是我循环的文件。

<root>
<table frame="none" tabstyle="wrap4">
    <tgroup cols="4">
        <colspec colnum="1" colname="col1" colwidth="10*"/>
        <colspec colnum="2" colname="COLSPEC0" colwidth="10.00*"/>
        <colspec colnum="3" colname="col2" colwidth="275*"/>
        <colspec colnum="4" colname="col3" colwidth="15*"/>
        <tbody>
            <row>
                <entry colsep="0" rowsep="0">Text1</entry>
                <entry colsep="0" rowsep="0"/>
                <entry colsep="0" rowsep="0"/>
                <entry colsep="0" rowsep="0" align="right">75</entry>
            </row>
            <row>
                <entry colsep="0" rowsep="0">Text2</entry>
                <entry colsep="0" rowsep="0"/>
                <entry colsep="0" rowsep="0"/>
                <entry colsep="0" rowsep="0" align="right">84</entry>
            </row>
        </tbody>
    </tgroup>
</table>
</root>

首先,我尝试遍历每个文件中的所有可用文件,查找其中包含MAIN的预处理,然后查看我的值是否存在于该预处理指令中。下面是我的XSLT块。

<xsl:template match="entry[@align='right']" mode="y">
        <xsl:analyze-string select="." regex="([0-9]+)">
            <xsl:matching-substring>
                <xsl:variable name="prent" select="document(document('file:///C:\Users\userId\Desktop\Proview\AUS Journal\02FEB/title.xml')/entry/file/@name)/*[contains(//root/processing-instruction('xpp')[contains(.,'MAIN')],regex-group(1))]/substring-before(tokenize(document-uri(/), '/')[last()], '.')"/>
                <xsl:variable name="cha">
                    <xsl:value-of select="$prent"/>
                </xsl:variable>
                <xsl:variable name="size">
                    <xsl:value-of select="string-length($cha)"/>
                </xsl:variable>
                <xsl:variable name="conct">
                    <xsl:value-of select="concat($cha,'/pg_',.)"/>
                </xsl:variable>
                <a href="{$conct}">
                    <xsl:value-of select="regex-group(1)"/>
                </a>
            </xsl:matching-substring>
            <xsl:non-matching-substring>
                <xsl:value-of select="."/>
            </xsl:non-matching-substring>
        </xsl:analyze-string>
    </xsl:template>

当我运行时,我收到以下错误。

XSLT 2.0 Debugging Error: Error: file:///C:/Users/userId/Desktop/Proview/AUS%20Journal/02FEB/XSLT/Journal.xsl:674: Wrong occurrence to match required sequence type -   Details: -     XPTY0004: The supplied sequence ('2' item(s)) has the wrong occurrence to match the sequence type xs:string ('zero or one').

请让我知道如何解决这个问题并完成工作。

由于

1 个答案:

答案 0 :(得分:2)

尝试更改步骤

*[contains(//root/processing-instruction('xpp')[contains(.,'MAIN')],regex-group(1))]

*[//root/processing-instruction('xpp')[contains(.,'MAIN')][contains(., regex-group(1))]]

解决了这个问题。

相关问题