XSLT에는 split () 함수가 있습니까?
문제
노드에 문자열이 있고 문자열을 ''켜고 싶습니까? ' 배열에서 마지막 항목을 반환합니다.
예를 들어 아래 블록에서 :
<a>
<xsl:attribute name="href">
/newpage.aspx?<xsl:value-of select="someNode"/>
</xsl:attribute>
Link text
</a>
나누고 싶어요 someNode
값.
편집 : ASP.NET 페이지의 XSL을로드하는 데 사용하는 vb.net은 다음과 같습니다.
Dim xslDocPath As String = HttpContext.Current.Server.MapPath("~/App_Data/someXslt.xsl")
Dim myXsltSettings As New XsltSettings()
Dim myXMLResolver As New XmlUrlResolver()
myXsltSettings.EnableScript = True
myXsltSettings.EnableDocumentFunction = True
myXslDoc = New XslCompiledTransform(False)
myXslDoc.Load(xslDocPath, myXsltSettings, myXMLResolver)
Dim myStringBuilder As New StringBuilder()
Dim myXmlWriter As XmlWriter = Nothing
Dim myXmlWriterSettings As New XmlWriterSettings()
myXmlWriterSettings.ConformanceLevel = ConformanceLevel.Auto
myXmlWriterSettings.Indent = True
myXmlWriterSettings.OmitXmlDeclaration = True
myXmlWriter = XmlWriter.Create(myStringBuilder, myXmlWriterSettings)
myXslDoc.Transform(xmlDoc, argumentList, myXmlWriter)
Return myStringBuilder.ToString()
업데이트: 여기에 있습니다 특정 노드에서 XML을 분할하는 예
해결책
재귀 방법 사용 :
<xsl:template name="output-tokens">
<xsl:param name="list" />
<xsl:variable name="newlist" select="concat(normalize-space($list), ' ')" />
<xsl:variable name="first" select="substring-before($newlist, ' ')" />
<xsl:variable name="remaining" select="substring-after($newlist, ' ')" />
<id>
<xsl:value-of select="$first" />
</id>
<xsl:if test="$remaining">
<xsl:call-template name="output-tokens">
<xsl:with-param name="list" select="$remaining" />
</xsl:call-template>
</xsl:if>
</xsl:template>
다른 팁
XSLT 2.0 이상을 사용할 수 있다면 사용할 수 있습니다. tokenize(string, separator)
:
tokenize("XPath is fun", "\s+")
Result: ("XPath", "is", "fun")
기본적으로 .NET은 XSLT 3.0은 물론 XSLT 2.0을 지원하지 않습니다. .NET에 유일하게 알려진 2.0+ 프로세서가 있습니다 .NET 용 색소폰 ~와 함께 IKVM, exselt, 현재 베타에있는 .NET XSLT 3.0 프로세서, XMLPRIME XSLT 2.0 프로세서.
나는 결국 그것을 사용했다 substring-after()
기능. 저에게 효과가있는 것은 다음과 같습니다.
<a>
<xsl:attribute name="href">
/newpage.aspx?<xsl:value-of select="substring-after(someNode, '?')"/>
</xsl:attribute>
Link text
</a>
내 XSLT 버전을 2.0으로 설정 한 후에도 여전히 "'tokenize()' is an unknown XSLT function.
"사용하려고 할 때 오류 tokenize()
.
템플릿 엔진이 지원되는 경우 또 다른 가능성을 추가합니다 exslt, 그러면 사용할 수 있습니다 토큰 화 () 그것을 통해서.
예를 들어:
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:str="http://exslt.org/strings"
extension-element-prefixes="str">
...
<a>
<xsl:attribute name="href">
<xsl:text>/newpage.aspx?</xsl:text>
<xsl:value-of select="str:tokenize(someNode)[2]"/>
</xsl:attribute>
</a>
...
</xsl:stylesheet>
사용하여 템플릿을 쓸 수 있습니다 string-before
그리고 string-after
기능을 수행하고 사용합니다. 나는 a 블로그 이에.
마지막으로 구분 된 문자열을 하위 문자로 분할하는 XSLT 템플릿을 만들었습니다. 나는 그것이 가장 똑똑한 대본이라고 주장하지는 않지만 반드시 내 문제를 해결합니다.
스타일 시트 :
<?xml version="1.0" encoding="iso-8859-1"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/">
<xsl:for-each select="Paths/Item">
<xsl:call-template name="SplitText">
<xsl:with-param name="inputString" select="Path"/>
<xsl:with-param name="delimiter" select="Delimiter"/>
</xsl:call-template>
<br/>
</xsl:for-each>
</xsl:template>
<xsl:template name="SplitText">
<xsl:param name="inputString"/>
<xsl:param name="delimiter"/>
<xsl:choose>
<xsl:when test="contains($inputString, $delimiter)">
<xsl:value-of select="substring-before($inputString,$delimiter)"/>
<xsl:text disable-output-escaping = "no"> </xsl:text>
<xsl:call-template name="SplitText">
<xsl:with-param name="inputString" select="substring-after($inputString,$delimiter)"/>
<xsl:with-param name="delimiter" select="$delimiter"/>
</xsl:call-template>
</xsl:when>
<xsl:otherwise>
<xsl:choose>
<xsl:when test="$inputString = ''">
<xsl:text></xsl:text>
</xsl:when>
<xsl:otherwise>
<xsl:value-of select="$inputString"/>
<xsl:text> </xsl:text>
</xsl:otherwise>
</xsl:choose>
</xsl:otherwise>
</xsl:choose>
</xsl:template>
</xsl:stylesheet>
XML 파일 (변환) :
<?xml version="1.0" encoding="utf-8"?>
<?xml-stylesheet type="text/xsl" href="textSpliter.xslt"?>
<Paths>
<Item>
<Path>C:\ProgramFiles\SomeWierdSoftware</Path>
<Delimiter>\</Delimiter>
</Item>
</Paths>
XSLT 1.0에는 분할 함수 자체가 없지만 기판 전 및 서브 스트링 기능 기능으로 수행하려는 작업을 달성 할 수 있습니다.
또는 Microsoft XSLT 엔진을 사용하는 경우 인라인 C#을 사용할 수 있습니다.
레코드를 위해서는 1.0 으로이 작업을 수행하고 실제로 분할/토큰 화이 필요하다면 XSLT 확장.