Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/xslt/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Xslt 无法获取具有位置的节点的值_Xslt - Fatal编程技术网

Xslt 无法获取具有位置的节点的值

Xslt 无法获取具有位置的节点的值,xslt,Xslt,我有一个XML,其中有10个短语节点 我试图使用下面的XSLT获得第二个短语 <xsl:value-of select="document(concat('C:\Users\u0138039\Desktop\Proview\Files\','MCPV1_ ORD_34.XML'))/chapter//phrase[2]"/> 令我惊讶的是,这不起作用 当我使用下面的方法时 <xsl:value-of select="document(concat('C:\Users\u0

我有一个XML,其中有10个
短语
节点

我试图使用下面的XSLT获得第二个短语

<xsl:value-of select="document(concat('C:\Users\u0138039\Desktop\Proview\Files\','MCPV1_
ORD_34.XML'))/chapter//phrase[2]"/>

令我惊讶的是,这不起作用

当我使用下面的方法时

<xsl:value-of select="document(concat('C:\Users\u0138039\Desktop\Proview\Files\','MCPV1_
ORD_34.XML'))/chapter//phrase"/>

输入XML:

<?xml version="1.0" encoding="utf-8"?>
<index>
  <secondaryie>certification, 34/12</secondaryie>
 </index>
<xsl:template match="index">
  <div class="index">
    <xsl:apply-templates/>
  </div>
</xsl:template>

<xsl:template match="secondaryie">
  <div class="secondaryie">
    <xsl:apply-templates/>
  </div>
</xsl:template>

<xsl:template match="text()">
  <xsl:analyze-string select="." regex="([\w]+)/([\w]+)">
    <xsl:matching-substring>
      <xsl:variable name="prent">
        <xsl:for-each select="document('C:\Users\u0138039\Desktop\Proview\Files\title.xml')/entry/file">
          <xsl:value-of select="document(concat('C:\Users\u0138039\Desktop\Proview\Files\',./@name))/chapter[//phrase=.]/@num"/>
        </xsl:for-each>
      </xsl:variable>
      <a href="{$prent}">
        <xsl:value-of select="."/>
      </a>
    </xsl:matching-substring>
    <xsl:non-matching-substring>
      <xsl:value-of select="."/>
    </xsl:non-matching-substring>
  </xsl:analyze-string>
</xsl:template>

认证,34/12
title.xml

<?xml version="1.0" encoding="utf-8"?>
<entry>
  <file name="MCPV1_ORD_30.xml"/>
  <file name="MCPV1_ORD_31.xml"/>
  <file name="MCPV1_ORD_32.xml"/>
  <file name="MCPV1_ORD_33.xml"/>
  <file name="MCPV1_ORD_34.xml"/>
  <file name="MCPV1_ORD_35.xml"/>
</entry>
<?xml version="1.0" encoding="utf-8"?>
<chapter num="34">
  <section level="sect1" number-type="manual" num="nonum">
    <para>
      <phrase>34/0/2</phrase>
    </para>
  </section>
  <section level="sect1" number-type="manual" num="nonum">
    <para>
      <phrase>34/0/3</phrase>
    </para>
  </section>
  <section level="sect1" number-type="manual" num="nonum">
    <para>
      <phrase>34/1</phrase>
    </para>
    <para>
      <phrase>34/1/1</phrase>
    </para>
  </section>
</chapter>

第34章xml

<?xml version="1.0" encoding="utf-8"?>
<entry>
  <file name="MCPV1_ORD_30.xml"/>
  <file name="MCPV1_ORD_31.xml"/>
  <file name="MCPV1_ORD_32.xml"/>
  <file name="MCPV1_ORD_33.xml"/>
  <file name="MCPV1_ORD_34.xml"/>
  <file name="MCPV1_ORD_35.xml"/>
</entry>
<?xml version="1.0" encoding="utf-8"?>
<chapter num="34">
  <section level="sect1" number-type="manual" num="nonum">
    <para>
      <phrase>34/0/2</phrase>
    </para>
  </section>
  <section level="sect1" number-type="manual" num="nonum">
    <para>
      <phrase>34/0/3</phrase>
    </para>
  </section>
  <section level="sect1" number-type="manual" num="nonum">
    <para>
      <phrase>34/1</phrase>
    </para>
    <para>
      <phrase>34/1/1</phrase>
    </para>
  </section>
</chapter>

34/0/2
34/0/3
34/1
34/1/1
XSLT:

<?xml version="1.0" encoding="utf-8"?>
<index>
  <secondaryie>certification, 34/12</secondaryie>
 </index>
<xsl:template match="index">
  <div class="index">
    <xsl:apply-templates/>
  </div>
</xsl:template>

<xsl:template match="secondaryie">
  <div class="secondaryie">
    <xsl:apply-templates/>
  </div>
</xsl:template>

<xsl:template match="text()">
  <xsl:analyze-string select="." regex="([\w]+)/([\w]+)">
    <xsl:matching-substring>
      <xsl:variable name="prent">
        <xsl:for-each select="document('C:\Users\u0138039\Desktop\Proview\Files\title.xml')/entry/file">
          <xsl:value-of select="document(concat('C:\Users\u0138039\Desktop\Proview\Files\',./@name))/chapter[//phrase=.]/@num"/>
        </xsl:for-each>
      </xsl:variable>
      <a href="{$prent}">
        <xsl:value-of select="."/>
      </a>
    </xsl:matching-substring>
    <xsl:non-matching-substring>
      <xsl:value-of select="."/>
    </xsl:non-matching-substring>
  </xsl:analyze-string>
</xsl:template>

过程是我使用XSLT运行输入XML,它将循环通过title.XML,然后将正则表达式与文档中的
短语匹配(这里我使用34作为参考),它应该打印章节值

在我的XML中存在
34/12
,因此它应该打印
,在我的输出中显示

请有人告诉我,我如何修复它,以及为什么在第一种情况下没有提取数据

谢谢

而不是这个

<xsl:value-of select="document(concat('C:\Users\u0138039\Desktop\Proview\Files\','MCPV1_
ORD_34.XML'))/chapter//phrase[2]"/>

试试这个:

<xsl:value-of select="(document(concat(C:\Users\u0138039\Desktop\Proview\Files\','MCPV1_ORD_34.XML'))/chapter//phrase)[2]"/>


您将获得第二个节点。对于你的34.xml,我得到了一个值为“34/0/3”的节点。

“让我惊讶的是,它不工作。”你说的“不工作”是什么意思?请发布一个可复制的示例,包括一个示例XML输入。这会抛出null,没有输出您可以发布通过文档functionHi@michael.hor257k加载的XML吗?很抱歉,延迟,我发布了示例XML和XSLT以及当前和预期的outputHi@Saurav,我已经更新了我的问题这是有效的,很抱歉,实际要求是通过title.xml循环将
input.xml
中的数字与
章节中的短语匹配如果答案有效,请不要忘记接受答案