XSLT 2.0 sheet-uri没有获得正确的数据

时间:2016-06-29 17:31:31

标签: xml xslt saxon

我正在尝试从XSLT中定义的XML文件中提取数据:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xpath-default-namespace="example.com">

    <xsl:output method="xml" indent="yes"/>
    <xsl:param name="sheet-uri" select="'path/to/some.xml'"/>
    <xsl:param name="sheet-doc" select="document($sheet-uri)"/>

    <!-- Template here -->
    ...
    <xsl:for-each select="IsValid/time">
    <Debug>
        <xsl:variable name="referenced-code" select="$sheet-doc//Sheet/SomeData[time = current()]/id"/>
        <xsl:choose>
            <xsl:when test="$referenced-code">
                <xsl:value-of select="$referenced-code"/>
            </xsl:when>
            <xsl:otherwise>-1</xsl:otherwise>
        </xsl:choose>
    </Debug>
    ...

来源xml:

<Data xmlns="example.com">
    <id>21</id>
    <IsValid>
        <time>125622</time>
        <time>094522</time>
        <time>123456</time>
    </IsValid>
</Data>

XML(some.xml)如下所示:

<Sheet>
    <SomeData>
        <time>125622</time>
        <id>1</id>
    <SomeData>
    <SomeData>
        <time>094522</time>
        <id>1</id>
    <SomeData>
    <SomeData>
        <time>123456</time>
        <id>0</id>
    <SomeData>
</Sheet>

这始终会为-1打印<Debug>。为什么它不能正常工作?这在使用XSLT 1.0时工作正常。我正在尝试升级到2.0,所以我可以使用更多功能。

任何帮助将不胜感激,提前谢谢!

2 个答案:

答案 0 :(得分:1)

指定时:

some.xml

这适用于所有您的XPath表达式。由于<xsl:variable name="referenced-code" select="$sheet-doc//Sheet/SomeData[time = current()]/id"/> 文件不使用此命名空间,因此您的变量为:

    spinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
        @Override
        public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {

        }

        @Override
        public void onNothingSelected(AdapterView<?> parent) {

        }
    });

结束为空。

答案 1 :(得分:1)

如果一个XML文档在命名空间中有元素但另一个没有,那么你显然无法在任何地方使用xpath-default-namespace,但需要使用<xsl:variable name="referenced-code" xpath-default-namespace="" select="$sheet-doc//Sheet/SomeData[time = current()]/id"/>