XSLT에 스플릿() 기능이 있습니까?
노드에 문자열이 있는데 '?'에 문자열을 분할하고 배열의 마지막 항목을 반환하려고 합니다.
예를 들어, 아래 블록에서:
<a>
<xsl:attribute name="href">
/newpage.aspx?<xsl:value-of select="someNode"/>
</xsl:attribute>
Link text
</a>
저는 나눠 주세요.someNode
가치.
편집: 여기 VB가 있습니다.내 Asp용 Xsl을 로드하는 데 사용하는 네트.넷 페이지:
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")
w3schools XPath 함수 참조를 참조하십시오.
기본적으로 .NET은 XSLT 3.0은 물론 XSLT 2.0도 지원하지 않습니다..NET용으로 알려진 2.0 이상의 프로세서는 IKVM을 사용하는 .NET용 Saxon, 현재 베타 버전인 .NET XSLT 3.0 프로세서인 Exselt 및 XMLPrime XSLT 2.0 프로세서뿐입니다.
저는 그 기능을 사용하게 되었습니다.제가 성공한 것은 다음과 같습니다.
<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>
.NET은 XSLT 2.0을 지원하지 않습니다.나는 그것이 스플릿() 기능이 있는 EXSLT를 지원한다고 꽤 확신합니다.Microsoft는 EXSLT 구현에 대한 이전 페이지를 가지고 있습니다.
다음을 사용하여 템플릿을 작성할 수 있습니다.string-before
그리고.string-after
기능을 사용할 수 있습니다.저는 이것에 대해 블로그를 썼습니다.
마지막으로 구분된 문자열을 하위 문자열로 분할하는 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 확장자가 필요합니다.
언급URL : https://stackoverflow.com/questions/136500/does-xslt-have-a-split-function
'programing' 카테고리의 다른 글
왜 수학을 합니까?라운드(2.5)는 3 대신 2를 반환합니까? (0) | 2023.05.26 |
---|---|
대용량 파일(80GB)을 수집하여 속도를 높이는 방법은 없습니까? (0) | 2023.05.26 |
'제출' 버튼을 비활성화하는 방법은 무엇입니까? (0) | 2023.05.26 |
최고의 전투함 AI는 무엇입니까? (0) | 2023.05.26 |
이중 따옴표를 기본 따옴표 형식으로 사용하여 파이썬 사전을 만드는 방법은 무엇입니까? (0) | 2023.05.26 |