我希望在输出中看到hello
,但不会得到。
XSL
<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
version="1.0">
<xsl:output method="text"/>
<xsl:template match="/">
<xsl:if test="//target">
<xsl:value-of select="@field"/>
</xsl:if>
</xsl:template>
</xsl:stylesheet>
XML
<?xml version="1.0" encoding="utf-8"?>
<?xml-stylesheet type="text/xsl" href="callwithparms - Copy.xslt"?>
<xml>
<partOne>
<target field="hello"/>
</partOne>
<partTwo>
<number input="2" find="hello" />
<number input="2" find="world" />
</partTwo>
</xml>
更改
<xsl:value-of select="@field"/>
to
<xsl:value-of select="//target/@field"/>
(在此时,上下文节点上没有@field
属性; root; if
语句不会随着您的原始代码似乎期望而更改上下文节点。)
信用:感谢Daniel Haley纠正原始答案,说上下文节点是根本的根元素。
为什么您不能期望此输出?
因为您的转换将在纯文本中像这样读:
"匹配 root 并测试文档中的任何地方
<target>
中的任何地方,如果是这样,请选择当前节点的字段属性"
...它仍然是/
,而不是您期望的<target>
。
您的XSL应该看起来像这样:
<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:output method="text"/>
<!-- work your way thru the doc with matching templates ... -->
<xsl:template match="/">
<!-- ... and simply apply-templates -->
<xsl:apply-templates />
</xsl:template>
<xsl:template match="xml">
<!-- ... and more ... -->
<xsl:apply-templates />
</xsl:template>
<xsl:template match="partOne">
<!-- ... and more ... -->
<xsl:apply-templates />
</xsl:template>
<xsl:template match="target">
<!-- until you reach the desired element you need -->
<xsl:value-of select="@field"/>
</xsl:template>
<!-- creating empty templates for elements you like to ignore -->
<xsl:template match="partTwo" />
</xsl:stylesheet>
,如果您可以依靠一系列匹配的模板而不是试图对文档结构中的远方或向下触及的元素,那么复杂性就会变得更容易。