我在执行以下功能时遇到问题:
(i)我需要检查xml中的标签。如果它存在且不为空,我应该得到它的值,否则是默认值。我正在编写xslt,如下所示:
<xsl:if test="relation">
<xsl:choose>
<xsl:when test="boolean(relation/termId) and string(relation/termId) != ''">
<xsl:value-of select="relation/termId" />
</xsl:when>
<xsl:otherwise>
<xsl:text>DefaultTermId</xsl:text>
</xsl:otherwise>
</xsl:choose>
</xsl:if>
所以,relation / termId存在且有一些价值(比如<termId>x</termId>
,我应该得到x)xpath和所有都很好。当termId标记不存在时(=&gt;我得到'DefaultTermId')它正常工作,但是当标记没有值时返回空格。我的意思是什么时候是<termId></termId>
,我得到一个空的空间而不是'DefaultTermId'。我也尝试了relation/termId/text() != ''
,但没有用。
(ii)另一个问题是=&gt;我的xml如下所示:
<GetSavedReportResponse xmlns="">
<ResponseType>Success</ResponseType>
<FileModifiedDateTime>2012-01-03T17:05:04</FileModifiedDateTime>
<FileSizeBytes>7816</FileSizeBytes>
<FileDataFormat>XML</FileDataFormat>
<FileData>
<Zthes>
<term>
<termId>49555</termId>
<termUpdate>add</termUpdate>
<termName>Active Personnel</termName>
<termVocabulary>People Status Global</termVocabulary>
<termVocabulary>Employee Status Global</termVocabulary>
<termCategory>PDA</termCategory>
<termCategory>PDI</termCategory>
<termCategory>GLB</termCategory>
<relation weight="100">
<termId>49556</termId>
<relationType>EQ</relationType>
<termName>term name</termName>
<termVocabulary>term vocabulary</termVocabulary>
</relation>
<relation weight="100">
<termId>49556</termId>
<relationType>BT</relationType>
<termName>General Active Personnel</termName>
<termVocabulary>People Status Global Updated</termVocabulary>
</relation>
</term>
<term>
<termId>49554</termId>
<termUpdate>add</termUpdate>
<termName>General Active Personnel</termName>
<termVocabulary>People Status Global</termVocabulary>
<termCategory>PDI</termCategory>
</term>
</Zthes>
</FileData>
</GetSavedReportResponse>
这里,一个术语可以有多个termCategory标签。我需要检查这些节点中是否包含指定的子字符串,如果是,我需要提取整个术语节点。我尝试过如下:
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:template match="/">
<xsl:if test="termCategory">
<xsl:if test="substring(FileData/Zthes/term/termCategory, 1, 2) = 'GL'">
<xsl:copy>
<xsl:apply-templates select="term"/>
</xsl:copy>
</xsl:if>
</xsl:if>
</xsl:template>
</xsl:stylesheet>
但是,它运作不正常。输出应该是:
<GetSavedReportResponse xmlns="">
<ResponseType>Success</ResponseType>
<FileModifiedDateTime>2012-01-03T17:05:04</FileModifiedDateTime>
<FileSizeBytes>7816</FileSizeBytes>
<FileDataFormat>XML</FileDataFormat>
<FileData>
<Zthes>
<term>
<termId>49555</termId>
<termUpdate>add</termUpdate>
<termName>Active Personnel</termName>
<termVocabulary>People Status Global</termVocabulary>
<termVocabulary>Employee Status Global</termVocabulary>
<termCategory>PDA</termCategory>
<termCategory>PDI</termCategory>
<termCategory>GLB</termCategory>
<relation weight="100">
<relationType>EQ</relationType>
<termName>term name</termName>
<termVocabulary>term vocabulary</termVocabulary>
</relation>
<relation weight="100">
<relationType>BT</relationType>
<termName>General Active Personnel</termName>
<termVocabulary>People Status Global Updated</termVocabulary>
</relation>
</term>
<term>
</Zthes>
</FileData>
</GetSavedReportResponse>
p.s:子串poistion没有修复,所以我不能使用startswith等。我必须使用SubString。 因此,在上面的例子中:第一个术语的第三个术语类别包含'GL',因此应该检索它。第二个术语有一个termCategory但不包含'GL',因此,不应该检索它。请帮我,我做错了。提前谢谢。
此致
答案 0 :(得分:1)
您希望从输出中排除任何没有term
的{{1}},其字符串值以termCategory
开头:
"GL"
将此转换应用于提供的XML文档:
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:template match="node()|@*">
<xsl:copy>
<xsl:apply-templates select="node()|@*"/>
</xsl:copy>
</xsl:template>
<xsl:template match="term[not(termCategory[starts-with(.,'GL')])]"/>
</xsl:stylesheet>
产生了想要的正确结果:
<GetSavedReportResponse xmlns="">
<ResponseType>Success</ResponseType>
<FileModifiedDateTime>2012-01-03T17:05:04</FileModifiedDateTime>
<FileSizeBytes>7816</FileSizeBytes>
<FileDataFormat>XML</FileDataFormat>
<FileData>
<Zthes>
<term>
<termId>49555</termId>
<termUpdate>add</termUpdate>
<termName>Active Personnel</termName>
<termVocabulary>People Status Global</termVocabulary>
<termVocabulary>Employee Status Global</termVocabulary>
<termCategory>PDA</termCategory>
<termCategory>PDI</termCategory>
<termCategory>GLB</termCategory>
<relation weight="100">
<relationType>EQ</relationType>
<termName>term name</termName>
<termVocabulary>term vocabulary</termVocabulary>
</relation>
<relation weight="100">
<relationType>BT</relationType>
<termName>General Active Personnel</termName>
<termVocabulary>People Status Global Updated</termVocabulary>
</relation>
</term>
<term>
<termId>49554</termId>
<termUpdate>add</termUpdate>
<termName>General Active Personnel</termName>
<termVocabulary>People Status Global</termVocabulary>
<termCategory>PDI</termCategory>
</term>
</Zthes>
</FileData>
</GetSavedReportResponse>
解释:使用与没有<GetSavedReportResponse>
<ResponseType>Success</ResponseType>
<FileModifiedDateTime>2012-01-03T17:05:04</FileModifiedDateTime>
<FileSizeBytes>7816</FileSizeBytes>
<FileDataFormat>XML</FileDataFormat>
<FileData>
<Zthes>
<term>
<termId>49555</termId>
<termUpdate>add</termUpdate>
<termName>Active Personnel</termName>
<termVocabulary>People Status Global</termVocabulary>
<termVocabulary>Employee Status Global</termVocabulary>
<termCategory>PDA</termCategory>
<termCategory>PDI</termCategory>
<termCategory>GLB</termCategory>
<relation weight="100">
<relationType>EQ</relationType>
<termName>term name</termName>
<termVocabulary>term vocabulary</termVocabulary>
</relation>
<relation weight="100">
<relationType>BT</relationType>
<termName>General Active Personnel</termName>
<termVocabulary>People Status Global Updated</termVocabulary>
</relation>
</term>
</Zthes>
</FileData>
</GetSavedReportResponse>
孩子的任何term
匹配的单个模板覆盖 identity rule 其值以字符串termCategory
开头。此覆盖模板具有空体 - 因此有效地从输出中排除(删除)任何匹配的节点。
答案 1 :(得分:0)
不确定,但可能是你想要一个
<xsl:value-of select="relation/termId/text()" />
代替?
虽然你的xml中没有relation/termId
...
此外,在您的第二个示例中,您访问FileData
相对于GetSavedReportResponse
节点,而不是/
您评估它的上下文。