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计算基于日期条件的XML_Xslt_Date_Xslt 2.0_Saxon - Fatal编程技术网

使用xslt计算基于日期条件的XML

使用xslt计算基于日期条件的XML,xslt,date,xslt-2.0,saxon,Xslt,Date,Xslt 2.0,Saxon,我第一次使用xslt。我有2.0,但这是我使用c#transform库所能获得的唯一优势。我试图计算XML文档中包含12年前的日期且具有特定类型属性的子节点的数量 示例xml结构: <xml version=\"1.0\" encoding=\"utf-8\"?> <... /> <Dependents> <Dependent><DOB>1964-04-01</DOB><DependentType>Spouse&

我第一次使用xslt。我有2.0,但这是我使用c#transform库所能获得的唯一优势。我试图计算XML文档中包含12年前的日期且具有特定类型属性的子节点的数量

示例xml结构:

<xml version=\"1.0\" encoding=\"utf-8\"?>
<... />
<Dependents>
<Dependent><DOB>1964-04-01</DOB><DependentType>Spouse</DependentType></Dependent>
<Dependent><DOB>2000-01-01</DOB><DependentType>Child</DependentType></Dependent>
<Dependent><DOB>2012-01-01</DOB><DependentType>Child</DependentType></Dependent>
</Dependents>
<... />
它不起作用,因为从dateTime开始的月份(以及从dateTime开始的可能日期)没有添加前导零。对于今天,2012年3月21日,我将返回:Saxon.Api.DynamicError:无效的日期时间值“2000-3-21”(月份必须是两位数)(这意味着它们应该,但它们不是。)

我想要输出的是:

<xsl:text>&amp;numberofchildren=</xsl:text><xsl:value-of select="count(//InsuranceRequest/HealthInsurance/Dependents/Dependent/DependentType[text() = 'Child'])" />
<xsl:text>&amp;childrenunder12=</xsl:text><xsl:value-of select="children under twelve" />
&;儿童人数=
&;12岁以下儿童=
我越是强烈反对这一点,我就越觉得有一个更简单的方法,我只是没有看到


编辑:我清理了xslt语法,因此它是有效的,而不是双引号c#字符串。

您可以像
中那样简单地减去12年,然后使用例如
//Dependent[DependentType='Child'和xs:date(DOB)>=$tweeveyearsago]

[编辑] 下面是一个使用Saxon 9.4编译并执行良好的模板:

  <xsl:template match="/">
    <xsl:variable name="today" select="current-date()"/>
    <xsl:variable name="twelve-years-ago" select="$today - xs:yearMonthDuration('P12Y')"/>
    <xsl:value-of select="count(//Dependent[DependentType = 'Child' and xs:date(DOB) >= $twelve-years-ago])"/>
  </xsl:template>


yearMonthDuration运行得很好,尽管我发誓之前没有运行。。。毫无疑问,我犯了愚蠢的语法错误。但是,我不认为
DependedType='Child'
是正确的,我认为它需要以某种方式引用text()。至少,它不像你写的那样工作。我现在正在尝试一些东西,但是如果有任何提示,我都会非常感激。如果您愿意,您可以使用
//Dependent[DependentType/text()='Child']
,但我的建议已经足够了,而且在我看来更常用。只有在处理混合内容时才需要显式选择文本节点。如果您在工作中仍然存在问题,请发布最小但完整且可用的代码示例,然后我相信我们可以修复它。但我没有心情尝试将C#字符串转换成XML文档,只是为了让您相信
DependentType='Child'
是有效的代码。我看到的唯一问题是你的
dependendtype='Child'
有输入错误或名字不正确。你说得对,这个
计数(//Dependents/Dependent[DependentType='Child']
有效。但是我不能得到这个
计数(//Dependents/Dependent[xs:date(DOB)>=$tweveryasgo]))
开始工作。很抱歉输入错误。很抱歉,我认为您遇到的错误是无法将
xs:date
xs:dateTime
进行比较,最简单的修复方法是使用
current-date()
而不是
current-dateTime()
为您今天的
变量。我将用我用Saxon测试的一个示例编辑我的帖子。是的,这就成功了。我刚刚发现了它,并试图将DOB转换为日期时间,而不是您建议的简单得多的修复。我还发现我们使用的是Saxon 9.2,我试图找出它在哪里抛出了确切的错误。无论如何,非常感谢!
  <xsl:template match="/">
    <xsl:variable name="today" select="current-date()"/>
    <xsl:variable name="twelve-years-ago" select="$today - xs:yearMonthDuration('P12Y')"/>
    <xsl:value-of select="count(//Dependent[DependentType = 'Child' and xs:date(DOB) >= $twelve-years-ago])"/>
  </xsl:template>