我有xml,它有很多孩子和子孩子。我必须遍历元素的所有值,如果有任何空值或空白,我必须将其更改为破折号或其他值。
xml示例
<list>
<biglist>
<item>1</item>
<item>0</item>
<item>2</item>
<item>1</item>
<item></item>
<item>8</item>
<smallList>
<smallitem>0</smallitem>
<smallitem></smallitem>
<smallitem></smallitem>
<smallitem>4</smallitem>
</smallList>
</biglist>
</list>
输出
<div id=biglist>
<div>1</div>
<div>0</div>
<div>2</div>
<div>1</div>
<div><strong> Value not found </strong></div>
<div>8</div>
<div id=smallList>
<div>0</div>
<div><strong> Value not found </strong></div>
<div><strong> Value not found </strong></div>
<div>4</div>
</div>
</div>
答案 0 :(得分:1)
由于您没有提供示例输入XML,您可以调整以满足您的输入:
示例输入XML:
<list>
<item>1</item>
<item>0</item>
<item>2</item>
<item>1</item>
<item></item>
<item>8</item>
</list>
XSLT:
<?xml version="1.0" encoding="UTF-8" ?>
<xsl:transform xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
version="1.0">
<xsl:output method="xml" doctype-public="XSLT-compat"
omit-xml-declaration="yes" encoding="UTF-8" indent="yes" />
<xsl:template match="list">
<xsl:copy>
<xsl:apply-templates/>
</xsl:copy>
</xsl:template>
<xsl:template match="item">
<xsl:copy>
<xsl:apply-templates/>
</xsl:copy>
</xsl:template>
<xsl:template match="item[text()='0' or not(text()[normalize-space()])]">
<xsl:copy>
<xsl:text>-</xsl:text>
</xsl:copy>
</xsl:template>
</xsl:transform>
输出:
<list>
<item>1</item>
<item>-</item>
<item>2</item>
<item>1</item>
<item>-</item>
<item>8</item>
</list>
这会复制所有节点,但会将每个节点的值替换为没有值,或者使用短划线替换值0。
如果您希望更改单个出现的空格或使用短划线更改值,则为示例输入XML
<list>
<item>1 1</item>
<item>0</item>
<item>201</item>
<item>1</item>
<item></item>
<item>304</item>
<item>8</item>
</list>
在上面的XSLT中添加以下模板
<xsl:template match="item/text()[contains(.,'0') or contains(.,' ')]">
<xsl:value-of select="translate(.,'0 ','--')"/>
</xsl:template>
产生输出
<list>
<item>1-1</item>
<item>-</item>
<item>2-1</item>
<item>1</item>
<item>-</item>
<item>3-4</item>
<item>8</item>
</list>
使用translate()
。
在这种情况下,模板的匹配模式
<xsl:template match="item[text()='0' or not(text()[normalize-space()])]">
可以调整为
<xsl:template match="item[not(text()[normalize-space()])]">
至于text()='0'
的案例已经处理完毕。
答案 1 :(得分:1)
我需要更改值,然后通过应用其他输出到html 模板。
这不是XSLT的工作原理(除非你在两次传递中进行转换)。
尝试将以下模板添加到现有模板中:
<xsl:template match="*[not(* or text())]">
<div>
<strong> Value not found </strong>
</div>
</xsl:template>
以下是使用身份转换作为主要模板的示例:
XSLT 1.0
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
<xsl:strip-space elements="*"/>
<!-- identity transform -->
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
<!-- exception for empty leaf nodes -->
<xsl:template match="*[not(* or text())]">
<div>
<strong> Value not found </strong>
</div>
</xsl:template>
</xsl:stylesheet>
应用于您的示例输入,结果将为:
<?xml version="1.0" encoding="UTF-8"?>
<list>
<biglist>
<item>1</item>
<item>0</item>
<item>2</item>
<item>1</item>
<div>
<strong> Value not found </strong>
</div>
<item>8</item>
<smallList>
<smallitem>0</smallitem>
<div>
<strong> Value not found </strong>
</div>
<div>
<strong> Value not found </strong>
</div>
<smallitem>4</smallitem>
</smallList>
</biglist>
</list>