XSLT如何先抓下面的值
XSLT How to grab the value of the following first
我是 XSLT 的新手。
我有一个 XML 这样的:
<root>
<story>
<p>Text</p>
<p>Text</p>
<p>Text</p>
<strongp>
<color>Attention</color>
SomeText
</strongp>
<p>
Text of interest1
<a id="1234-3457">here</a>
</p>
<p>Text</p>
<p>Text</p>
<h5>Header H5</h5>
<strongp>
<color>Attention</color>
SomeText
</strongp>
<p>
Text of interest2
<a id="8909-3457">here</a>
</p>
<p>Text</p>
<p>Text</p>
<p>Text</p>
<p>Text</p>
<inline/>
</story>
</root>
这是我用来将 <strongp>
转换为另一个复杂元素的 xsl <remark>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes" />
<xsl:template match="node()|@*">
<xsl:copy>
<xsl:apply-templates select="node()|@*"/>
</xsl:copy>
</xsl:template>
<xsl:template match="strongp/color" />
<xsl:template match="strongp[color][contains(.,'Attention')]">
<remark>
<remarkheader>
<xsl:value-of select="normalize-space(.)"/>
</remarkheader>
<remarktext>
<xsl:for-each select=".">
<xsl:value-of select="normalize-space(following-sibling::p[1])"/>
</xsl:for-each></remarktext>
</remark>
</xsl:template>
</xsl:stylesheet>
输出:
<root>
<story>
<p>Text</p>
<p>Text</p>
<p>Text</p>
<remark>
<remarkheader>Attention SomeText</remarkheader>
<remarktext>Text of interest1 here</remarktext>
</remark>
<p>
Text of interest
<a id="1234-3457">here</a>
</p>
<p>Text</p>
<p>Text</p>
<h5>Header H5</h5>
<remark>
<remarkheader>Attention SomeText</remarkheader>
<remarktext>Text of interest2 here</remarktext>
</remark>
<p>
Text of interest
<a id="8909-3457">here</a>
</p>
<p>Text</p>
<p>Text</p>
<p>Text</p>
<p>Text</p>
<inline/>
</story>
</root>
在输出中我首先得到以下值<p>
。但我需要获取第一个 <p>
的值及其 所有标记 子元素内的属性。然后第一个 <p>
需要删除。我如何获得该标记并删除结果中的第一个 <p>
?
需要的结果:
<root>
<story>
<p>Text</p>
<p>Text</p>
<p>Text</p>
<remark>
<remarkheader>Attention SomeText</remarkheader>
<remarktext>Text of interest1 <a id="1234-3457">here</a></remarktext>
</remark>
<p>Text</p>
<p>Text</p>
<h5>Header H5</h5>
<remark>
<remarkheader>Attention SomeText</remarkheader>
<remarktext>Text of interest2 <a id="8909-3457">here</a></remarktext>
</remark>
<p>Text</p>
<p>Text</p>
<p>Text</p>
<p>Text</p>
<inline/>
</story>
</root>
您需要添加另一个模板以跳过处理 <strongp>
:
之后的 <p>
元素
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes" />
<xsl:strip-space elements="*"/>
<xsl:template match="node()|@*">
<xsl:copy>
<xsl:apply-templates select="node()|@*"/>
</xsl:copy>
</xsl:template>
<xsl:template match="strongp/color" />
<xsl:template match="p[preceding-sibling::*[1][self::strongp][color][contains(.,'Attention')]]"/>
<xsl:template match="strongp[color][contains(.,'Attention')]">
<remark>
<remarkheader>
<xsl:value-of select="normalize-space(.)"/>
</remarkheader>
<remarktext>
<xsl:apply-templates select="following-sibling::p[1]/node()"/>
</remarktext>
</remark>
</xsl:template>
</xsl:stylesheet>
我是 XSLT 的新手。 我有一个 XML 这样的:
<root>
<story>
<p>Text</p>
<p>Text</p>
<p>Text</p>
<strongp>
<color>Attention</color>
SomeText
</strongp>
<p>
Text of interest1
<a id="1234-3457">here</a>
</p>
<p>Text</p>
<p>Text</p>
<h5>Header H5</h5>
<strongp>
<color>Attention</color>
SomeText
</strongp>
<p>
Text of interest2
<a id="8909-3457">here</a>
</p>
<p>Text</p>
<p>Text</p>
<p>Text</p>
<p>Text</p>
<inline/>
</story>
</root>
这是我用来将 <strongp>
转换为另一个复杂元素的 xsl <remark>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes" />
<xsl:template match="node()|@*">
<xsl:copy>
<xsl:apply-templates select="node()|@*"/>
</xsl:copy>
</xsl:template>
<xsl:template match="strongp/color" />
<xsl:template match="strongp[color][contains(.,'Attention')]">
<remark>
<remarkheader>
<xsl:value-of select="normalize-space(.)"/>
</remarkheader>
<remarktext>
<xsl:for-each select=".">
<xsl:value-of select="normalize-space(following-sibling::p[1])"/>
</xsl:for-each></remarktext>
</remark>
</xsl:template>
</xsl:stylesheet>
输出:
<root>
<story>
<p>Text</p>
<p>Text</p>
<p>Text</p>
<remark>
<remarkheader>Attention SomeText</remarkheader>
<remarktext>Text of interest1 here</remarktext>
</remark>
<p>
Text of interest
<a id="1234-3457">here</a>
</p>
<p>Text</p>
<p>Text</p>
<h5>Header H5</h5>
<remark>
<remarkheader>Attention SomeText</remarkheader>
<remarktext>Text of interest2 here</remarktext>
</remark>
<p>
Text of interest
<a id="8909-3457">here</a>
</p>
<p>Text</p>
<p>Text</p>
<p>Text</p>
<p>Text</p>
<inline/>
</story>
</root>
在输出中我首先得到以下值<p>
。但我需要获取第一个 <p>
的值及其 所有标记 子元素内的属性。然后第一个 <p>
需要删除。我如何获得该标记并删除结果中的第一个 <p>
?
需要的结果:
<root>
<story>
<p>Text</p>
<p>Text</p>
<p>Text</p>
<remark>
<remarkheader>Attention SomeText</remarkheader>
<remarktext>Text of interest1 <a id="1234-3457">here</a></remarktext>
</remark>
<p>Text</p>
<p>Text</p>
<h5>Header H5</h5>
<remark>
<remarkheader>Attention SomeText</remarkheader>
<remarktext>Text of interest2 <a id="8909-3457">here</a></remarktext>
</remark>
<p>Text</p>
<p>Text</p>
<p>Text</p>
<p>Text</p>
<inline/>
</story>
</root>
您需要添加另一个模板以跳过处理 <strongp>
:
<p>
元素
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes" />
<xsl:strip-space elements="*"/>
<xsl:template match="node()|@*">
<xsl:copy>
<xsl:apply-templates select="node()|@*"/>
</xsl:copy>
</xsl:template>
<xsl:template match="strongp/color" />
<xsl:template match="p[preceding-sibling::*[1][self::strongp][color][contains(.,'Attention')]]"/>
<xsl:template match="strongp[color][contains(.,'Attention')]">
<remark>
<remarkheader>
<xsl:value-of select="normalize-space(.)"/>
</remarkheader>
<remarktext>
<xsl:apply-templates select="following-sibling::p[1]/node()"/>
</remarktext>
</remark>
</xsl:template>
</xsl:stylesheet>