Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/xpath/2.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_Xpath - Fatal编程技术网

XSLT从带有名称空间前缀的标记中获取值时出现问题

XSLT从带有名称空间前缀的标记中获取值时出现问题,xslt,xpath,Xslt,Xpath,从一些定义了名称空间前缀的XML中获取宽度和高度的值时,我遇到了一个特殊的问题。我可以使用名称空间为“n:”的普通xpath很容易地从RelatedMaterial获取其他值,例如SomeText,但无法获取宽度和高度的值 示例XML: <Description> <Information> <GroupInformation xml:lang="en"> <BasicDescription> <RelatedMaterial>

从一些定义了名称空间前缀的XML中获取宽度和高度的值时,我遇到了一个特殊的问题。我可以使用名称空间为“n:”的普通xpath很容易地从RelatedMaterial获取其他值,例如SomeText,但无法获取宽度和高度的值

示例XML:

<Description>
<Information>
<GroupInformation xml:lang="en">
 <BasicDescription>
  <RelatedMaterial>
   <SomeText>Hello</SomeText>
   <t:ContentProperties>
    <t:ContentAttributes>
     <t:Width>555</t:Width>
     <t:Height>444</t:Height>
    </t:ContentAttributes>
   </t:ContentProperties>
  </RelatedMaterial>
 </BasicDescription>
</GroupInformation>
</Information>
</Description>

你好
555
444
以下是XSLT的摘录:

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:n="urn:t:myfoo:2010" xmlns:tva2="urn:t:myfoo:extended:2008"

<xsl:apply-templates select="n:Description/n:Information/n:GroupInformation"/>

<xsl:template match="n:GroupInformation">
  <width>
    <xsl:value-of select="n:BasicDescription/n:RelatedMaterial/t:ContentProperties/t:ContentAttributes/t:Width"/>
  </width>
</xsl:template>

我不确定您是否意识到您的输入和XSLT都是无效的,最好提供工作示例

无论如何,如果我们查看XPath表达式
n:BasicDescription/n:RelatedMaterial/t:ContentProperties/t:ContentAttributes/t:Width
,您使用的前缀是
n
,它映射到
urn:t:myfoo:2010
,但是当数据事实位于默认名称空间中时。
t
前缀也是如此,它在输入数据和XSLT中都没有定义

您需要在XML数据和XSLT转换中定义“两侧”的名称空间,它们需要相同,不是前缀,而是URI

其他人可能比我更能解释这件事

我已经纠正了你的例子,并添加了一些东西,使这项工作

输入:

<?xml version="1.0" encoding="UTF-8"?>
<Description 
  xmlns="urn:t:myfoo:2010" 
  xmlns:t="something...">
  <Information>
    <GroupInformation xml:lang="en">
      <BasicDescription>
        <RelatedMaterial>
          <SomeText>Hello</SomeText>
          <t:ContentProperties>
            <t:ContentAttributes>
              <t:Width>555</t:Width>
              <t:Height>444</t:Height>
            </t:ContentAttributes>
          </t:ContentProperties>
        </RelatedMaterial>
      </BasicDescription>
    </GroupInformation>
  </Information>
</Description>
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet 
  xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0" 
  xmlns:n="urn:t:myfoo:2010" 
  xmlns:t="something...">

  <xsl:template match="/">
    <xsl:apply-templates select="n:Description/n:Information/n:GroupInformation"/>
  </xsl:template>

  <xsl:template match="n:GroupInformation">
    <xsl:element name="width">
      <xsl:value-of select="n:BasicDescription/n:RelatedMaterial/t:ContentProperties/t:ContentAttributes/t:Width"/>
    </xsl:element>
  </xsl:template>

</xsl:stylesheet>
<?xml version="1.0" encoding="UTF-8"?>
<width>555</width>

你好
555
444
XSLT:

<?xml version="1.0" encoding="UTF-8"?>
<Description 
  xmlns="urn:t:myfoo:2010" 
  xmlns:t="something...">
  <Information>
    <GroupInformation xml:lang="en">
      <BasicDescription>
        <RelatedMaterial>
          <SomeText>Hello</SomeText>
          <t:ContentProperties>
            <t:ContentAttributes>
              <t:Width>555</t:Width>
              <t:Height>444</t:Height>
            </t:ContentAttributes>
          </t:ContentProperties>
        </RelatedMaterial>
      </BasicDescription>
    </GroupInformation>
  </Information>
</Description>
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet 
  xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0" 
  xmlns:n="urn:t:myfoo:2010" 
  xmlns:t="something...">

  <xsl:template match="/">
    <xsl:apply-templates select="n:Description/n:Information/n:GroupInformation"/>
  </xsl:template>

  <xsl:template match="n:GroupInformation">
    <xsl:element name="width">
      <xsl:value-of select="n:BasicDescription/n:RelatedMaterial/t:ContentProperties/t:ContentAttributes/t:Width"/>
    </xsl:element>
  </xsl:template>

</xsl:stylesheet>
<?xml version="1.0" encoding="UTF-8"?>
<width>555</width>

输出:

<?xml version="1.0" encoding="UTF-8"?>
<Description 
  xmlns="urn:t:myfoo:2010" 
  xmlns:t="something...">
  <Information>
    <GroupInformation xml:lang="en">
      <BasicDescription>
        <RelatedMaterial>
          <SomeText>Hello</SomeText>
          <t:ContentProperties>
            <t:ContentAttributes>
              <t:Width>555</t:Width>
              <t:Height>444</t:Height>
            </t:ContentAttributes>
          </t:ContentProperties>
        </RelatedMaterial>
      </BasicDescription>
    </GroupInformation>
  </Information>
</Description>
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet 
  xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0" 
  xmlns:n="urn:t:myfoo:2010" 
  xmlns:t="something...">

  <xsl:template match="/">
    <xsl:apply-templates select="n:Description/n:Information/n:GroupInformation"/>
  </xsl:template>

  <xsl:template match="n:GroupInformation">
    <xsl:element name="width">
      <xsl:value-of select="n:BasicDescription/n:RelatedMaterial/t:ContentProperties/t:ContentAttributes/t:Width"/>
    </xsl:element>
  </xsl:template>

</xsl:stylesheet>
<?xml version="1.0" encoding="UTF-8"?>
<width>555</width>

555

您输入的文档不是有效的XML。未定义前缀
t
。你能澄清一下吗?