我试图更新一些XSLT以适应新的XML输入格式。新的结构几乎打破了我以前的模板逻辑,但我试图避免重写整个过程。如何获取XSLT模板中参数的节点名称?
本质上,我想抓取模板参数的名称,删除前缀,并在<xsl:value-of/>
中使用结果。例如:
<!-- calling location -->
<xsl:call-template name="myTemplate">
<xsl:with-param name="field" select="Name"/>
</xsl:call-template>
<!-- template to do the processing. -->
<xsl:template name="myTemplate">
<xsl:param name="field"/>
<xsl:variable name="fieldName" select="replace($field, 'Prefix', '')"/>
<xsl:value-of select="$fieldName"/>
</xsl:template>
上下文。
由于我被要求提供问题的本质和所有上下文,这更多的是全面的。我的样式表的简化版本可以蜜蜂如下图所示:
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0">
<xsl:variable name="delimiter" select="','" />
<xsl:variable name="newline" select="'
'" />
<xsl:template match="/root">
<xsl:apply-templates select="entry"/>
<xsl:apply-templates select="entry/Dependents"/>
</xsl:template>
<xsl:template match="entry">
<xsl:value-of select="Name"/>
<xsl:value-of select="$delimeter"/>
<xsl:value-of select="Address"/>
<xsl:value-of select="$delimeter"/>
<xsl:value-of select="Phone"/>
<xsl:value-of select="$newline"/>
</xsl:template>
<xsl:template match="entry/Dependents">
<xsl:call-template name="valueOrParentOrNone">
<xsl:with-param name="fieldValue" select="Name"/>
</xsl:call-template>
<xsl:value-of select="$delimeter"/>
<xsl:call-template name="valueOrParentOrNone">
<xsl:with-param name="fieldValue" select="Address"/>
</xsl:call-template>
<xsl:value-of select="$delimeter"/>
<xsl:call-template name="valueOrParentOrNone">
<xsl:with-param name="fieldValue" select="Phone"/>
</xsl:call-template>
<xsl:value-of select="$newline"/>
</xsl:template>
<xsl:template name="valueOrParentOrNone">
<xsl:param name="fieldValue"/>
<xsl:choose>
<!-- Use passed in node if exists -->
<xsl:when test="$fieldValue">
<xsl:value-of select="$fieldValue" />
</xsl:when>
<!-- Use parent node of the same name if exists -->
<xsl:when test="../$fieldName">
<xsl:value-of select="../$fieldName" />
</xsl:when>
<!-- Use "None" -->
<xsl:otherwise>
<xsl:text>"None"</xsl:text>
</xsl:otherwise>
</xsl:choose>
</xsl:template>
</xsl:stylesheet>
原始输入XML:
<root>
<entry>
<Name>J. Smith</Name>
<Address>1123 XML Lane</Address>
<Phone>123-456-7890</Phone>
<Dependents>
<Name>S. Smith</Name>
<Address>1123 XML Lane</Address>
<Phone>123-456-0987</Phone>
</Dependents>
</entry>
<entry>
<Name>L. Hines</Name>
<Address>423 Programming Way</Address>
<Dependents>
<Name>P. Hines</Name>
</Dependents>
</entry>
</root>
投入新XML
<root>
<entry>
<Name>J. Smith</Name>
<Address>1123 XML Lane</Address>
<Phone>123-456-7890</Phone>
<DependentName>S. Smith</DependentName>
<DependentAddress>1123 XML Lane</DependentAddress>
<DependentPhone>123-456-0987</DependentPhone>
</entry>
<entry>
<Name>L. Hines</Name>
<Address>423 Programming Way</Address>
<DependentName>P. Hines</DependentName>
</entry>
</root>
你会发现,并不是所有的值都是以上述两种格式提供。当依赖值不存在时,我需要重用父值。如果不存在,我需要使用“None”的值。输入格式已更改,以便Dependents
兄弟姐妹不再存在。相反,Dependents
的孩子已经被提升为兄弟姐妹的正常人价值,现在是entry
的直接子女。
预期输出。
"J. Smith","1123 XML Lane","123-456-7890"
"S. Smith","1123 XML Lane","123-456-0987"
"L. Hines","423 Programming Way",,
"P. Hines","423 Programming Way","None"
编辑:对不起,容易混淆。
请不要使用示例XML,上面写着'','',等当你的节点真的没有在其名称中的计数器。对于试图回答你的问题的人来说,编写XSLT是非常困难的。此外,修正示例中的语法错误,并使它们适合您的XSLT代码 - 或从您的XSLT代码中删除与您的问题无关的所有部分。 –
Tomalak
@Tomalak。固定。 – jktravis
好的,还有一些'functx:stripCommas()'业务正在进行,这并没有什么实际影响,但它更好。对未来而言:将问题简化为本质有益于那些回答问题的人,对于下一个发现问题的人,而不是至少对你而言,因为它有助于充实自己的头脑。 – Tomalak