我正在研究XSLT。
源 XML:
<?xml version="1.0" encoding="iso-8859-1"?>
<Content>
<alertHeader>
<ol xmlns="http://www.w3.org/1999/xhtml">
<li>
<strong>Review</strong>
your current available balance. It can be obtained 24 hours a day, 7 days a week through
<a href="/ALL_UNDER_123">Account Activity</a>
any 123 ATM or by calling
<a id="dynamicvariable" href="#" name="Customercare">[Customercare]</a>
at
<a id="dynamicvariable" href="#" name="contactNo">[contactNo]</a>
.
</li>
<li>
<strong>Take into consideration</strong>
<ul>
<li>Please get in touch with us</li>
<li>Please consider this as important info</li>
</ul>
</li>
<li>
<strong>Current</strong>
Statementt doesnot match the requirement
<a id="dynamicvariable" href="#" name="Actual acccount">[Actual acccount]</a>
,plus
<a id="dynamicvariable" href="#" name="totalcharges">[totalcharges]</a>
Make u r response as positive.
</li>
</ol>
<p xmlns="http://www.w3.org/1999/xhtml"></p>
<div xmlns="http://www.w3.org/1999/xshtml"></div>
<span xmlns="http://www.w3.org/1999/xshtml"></span>
</alertHeader>
</Content>
我想编写一个 XSLT 来将标签 alertHeader 中的整个内容作为值传递给另一个模板。
我想修改此代码,如下所示。
1.Remove the tags <p></p>, and <div></div>,<span></span> and <a></a>. I want to remove only tags but not the value of the tags. It should be there as it is.
2.Pass the content including tags to "Process" template.
所需输出:
<aaa>
<text>
<ol xmlns="http://www.w3.org/1999/xhtml">
<li>
<strong>Review</strong>
your current available balance. It can be obtained 24 hours a day, 7 days a week through
<dynamicvariable name="Customercare"/>
at
<dynamicvariable name="contactNo"/>
.
</li>
<li>
<strong>Take into consideration</strong>
<ul>
<li>Please get in touch with us</li>
<li>Please consider this as important info</li>
</ul>
</li>
<li>
<strong>Current</strong>
Statementt doesnot match the requirement
</li>
</ol>
</text>
</aaa>
当前 XSLT:
<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" indent="yes"/>
<xsl:template match="alertHeader">
<xsl:call-template name="process">
<xsl:with-param name="text" select="." />
</xsl:call-template>
</xsl:template>
<xsl:template name="process">
<xsl:param name="text" />
<xsl:variable name="head" select="substring-before($text, '[')" />
<xsl:variable name="tag" select="substring-before(substring-after($text, '['), ']')" />
<xsl:variable name="tail" select="substring-after($text, ']')" />
<xsl:choose>
<xsl:when test="$head != '' and $tag != ''">
<xsl:value-of select="$head" />
<dynamicVariable name="{$tag}" />
<!-- recursive step: process the remainder of the string -->
<xsl:call-template name="process">
<xsl:with-param name="text" select="$tail" />
</xsl:call-template>
</xsl:when>
<xsl:otherwise>
<xsl:value-of select="$text" />
</xsl:otherwise>
</xsl:choose>
</xsl:template>
</xsl:stylesheet>
任何人都可以说出我的代码所需的所有更改。
谢谢。
无需对 XML 文档进行任何初始处理,然后将其传递给过程模板。从你的问题来看,你似乎有一个要求(你没有明确提到)将文本中的"标签"(例如表单"[Total_Fee]")转换为动态变量元素。
因此,您需要做的是首先有一个模板来忽略您选择的节点,但继续匹配其中的元素和文本。
<xsl:template match="Content|alertHeader|xhtml:p|xshtml:div|xshtml:span|xhtml:a">
<xsl:apply-templates select="@*|node()"/>
</xsl:template>
请注意,这里的复杂性在于您已经为某些节点定义了不同的命名空间(这些命名空间必须在 XSLT 文档中声明)。如果您有多个命名空间,还可以执行以下操作。
<xsl:template match="Content|alertHeader|*[local-name() = 'p']|*[local-name() = 'span']|*[local-name() = 'div']|*[local-name() = 'a']">
如果没有命名空间,您可以执行以下操作
<xsl:template match="Content|alertHeader|p|div|span|a">
接下来,可以组合命名过程模板以匹配 text() 元素
<xsl:template match="text()" name="process">
这允许它匹配文本元素,并递归调用自身以在文本中查找标签。
这是完整的 XSLT
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xhtml="http://www.w3.org/1999/xhtml"
xmlns:xshtml="http://www.w3.org/1999/xshtml"
exclude-result-prefixes="xhtml xshtml">
<xsl:output method="xml" indent="yes"/>
<xsl:template match="Content|alertHeader|xhtml:p|xshtml:div|xshtml:span|xhtml:a">
<xsl:apply-templates select="@*|node()"/>
</xsl:template>
<xsl:template match="text()" name="process">
<xsl:param name="text" select="." />
<xsl:choose>
<xsl:when test="contains($text, ']') and contains($text, '[')">
<xsl:value-of select="substring-before($text, '[')"/>
<dynamicVariable name="{substring-before(substring-after($text, '['), ']')}"/>
<xsl:call-template name="process">
<xsl:with-param name="text" select="substring-after($text, ']')"/>
</xsl:call-template>
</xsl:when>
<xsl:otherwise>
<xsl:value-of select="$text"/>
</xsl:otherwise>
</xsl:choose>
</xsl:template>
<xsl:template match="@*|*">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
应用于 XML 时,输出如下
<ol xmlns="http://www.w3.org/1999/xhtml">
<li>
<strong>Review</strong> your current available balance. It can be obtained 24 hours a day, 7 days a week through Account Activity any Wells Fargo ATM or by calling <dynamicVariable name="Call_Center_Name" xmlns="" /> at <dynamicVariable name="Phone_Number" xmlns="" /> . </li>
<li>
<strong>Take into account</strong>
<ul>
<li>Your pending transactions and any additional transactions that have not yet been deducted from your available balance, such as checks you have written or upcoming scheduled automatic payments.</li>
<li>Any transactions that have been returned because you did not have enough money in your account at that time; they may be resubmitted for payment by the person or party who received the payment from you</li>
</ul>
</li>
<li>
<strong>Deposit</strong> enough money to establish and maintain a positive account balance. A deposit of at least <dynamicVariable name="Absolute_Available_Balance" xmlns="" /> ,plus <dynamicVariable name="Total_Fee" xmlns="" /> in fees, would have been required to make your account balance positive at the time we sent this notice. </li>
</ol>
xslt-1.0 中的问题是无法访问结果节点或节点集,因为没有 XPath 或函数或任何引用模板转换结果的东西。
你按原样称呼process
是否必不可少? 我这样做的方法是将process
制作为一个模板,该模板只转换一个节点,然后从alertHeader
下面的每个节点调用它,例如:
<xsl:template match="alertHeader">
<!-- switch modes so we know we need to call process -->
<xsl:apply-templates mode="callproc"/>
</xsl:template>
<xsl:template match="*" mode="callproc">
<!-- call process on THIS node -->
<xsl:call-template name="process">
<xsl:with-param name="text" select="."/>
</xsl:call-template>
<!-- descend -->
<xsl:apply-templates mode="callproc"/>
</xsl:template>
<!-- all the stuff that needs stripping -->
<xsl:template match="p|div|span|a" mode="callproc">
<!-- call process on the text() portion -->
<xsl:call-template name="process">
<xsl:with-param name="text" select="text()"/>
</xsl:call-template>
<!-- no descent here -->
</xsl:template>
更新:没有process
模板
<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xh="http://www.w3.org/1999/xhtml"
xmlns:xsh="http://www.w3.org/1999/xshtml">
<xsl:output method="xml" indent="yes"/>
<xsl:template match="Content">
<xsl:apply-templates/>
</xsl:template>
<xsl:template match="alertHeader">
<xsl:element name="aaa">
<xsl:element name="text">
<!-- switch modes so we know we need to call process -->
<xsl:apply-templates/>
</xsl:element>
</xsl:element>
</xsl:template>
<xsl:template match="*">
<xsl:copy>
<!-- descend -->
<xsl:apply-templates/>
</xsl:copy>
</xsl:template>
<!-- all the stuff that needs stripping -->
<xsl:template match="xh:p|xh:div|xh:span|xsh:div|xsh:span">
<xsl:apply-templates/>
</xsl:template>
<!-- was process -->
<xsl:template match="xh:a[@name]">
<xsl:element name="dynamicvariable" namespace="http://www.w3.org/1999/xhtml">
<xsl:attribute name="name">
<xsl:value-of select="@name"/>
</xsl:attribute>
</xsl:element>
</xsl:template>
<xsl:template match="xh:a"/>
<xsl:template match="text()">
<xsl:value-of select="."/>
</xsl:template>
</xsl:stylesheet>
输出:
<ol xmlns="http://www.w3.org/1999/xhtml">
<li>
<strong>Review</strong>
your current available balance. It can be obtained 24 hours a day, 7 days a week through
any Wells Fargo ATM or by calling
<dynamicvariable name="Call_Center_Name"/>
at
<dynamicvariable name="Phone_Number"/>
.
</li>
<li>
<strong>Take into account</strong>
<ul>
<li>Your pending transactions and any additional transactions that have not yet been deducted from your available balance, such as checks you have written or upcoming scheduled automatic payments.</li>
<li>Any transactions that have been returned because you did not have enough money in your account at that time; they may be resubmitted for payment by the person or party who received the payment from you</li>
</ul>
</li>
<li>
<strong>Deposit</strong>
enough money to establish and maintain a positive account balance. A deposit of at least
<dynamicvariable name="Absolute_Available_Balance"/>
,plus
<dynamicvariable name="Total_Fee"/>
in fees, would have been required to make your account balance positive at the time we sent this notice.
</li>
</ol>
</text>
</aaa>